-
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
/**
* 定义人类: Person
* 数据成员: m_strName
* 成员函数: attack()
*/
class Person
{
public:
string m_strName;
void attack()
{
cout << "attack" << endl;
}
};
/**
* 定义士兵类: Soldier
* 士兵类公有继承人类
* 数据成员: m_strName
* 成员函数: attack()
*/
class Soldier:public Person
{
public:
string m_strName;
void attack()
{
cout << "fire!!!" << endl;
}
};
int main(void)
{
// 实例士兵对象
Soldier soldier;
// 向士兵属性赋值"tomato"
soldier.m_strName = "tomato";
// 通过士兵对象向人类属性赋值"Jim"
soldier.Person::m_strName = "Jim";
// 打印士兵对象的属性值
cout << soldier.m_strName << endl;
// 通过士兵对象打印人类属性值
cout << soldier.Person::m_strName << endl;
// 调用士兵对象方法
soldier.attack();
// 通过士兵对象调用人类方法
soldier.Person::attack();
return 0;
}
查看全部 -
在菱形继承中重定义是一定会出现的,为了避免这种情况可以使用宏定义,在被多继承的类的.h文件中加上#ifndef...#define......#endif
查看全部 -
class Worker:virtual public Person { }; class Farmer:virtual public Person { };
class MigrantWorker:public Worker,public Farmer { };
工人类要继承人类,农民类也要继承人类,农民工类要多继承工人类和农民类,这时农民工类里面会有两份人类的数据成员,这是错误的,使用虚继承virtual就能避免这个问题,产生的对象中就只有一份人类的数据成员了
菱形继承
查看全部 -
三种方式:
void test1 (Person p):会实例化一个临时对象p,所以有销毁对象的痕迹
void test2 (Person &p):只是起了一个别名
void test3 (Person *p):同test2
test2.test3并不会产生临时变量,效率更高
查看全部 -
当使用父类的一个指针去指向一个子类的对象,先调用父类的构造函数再调用子类的构造函数,在销毁父类对象的时候是不会执行子类的析构函数的,这样就有可能导致内存泄漏,为了避免这种情况,可以使用虚析构函数,加上关键字virtual,先调用子类的析构函数再调用父类的析构函数
查看全部 -
父类实例化的对象可以接收子类的对象,但是会发生数据成员的截断
:士兵(子类)一定是人(父类),人却不一定是士兵
查看全部 -
当进行protected保护继承的时候,父类中的public和protected成员都会被继承到子类的protected中,所以子类实例化的对象只能访问到子类本身的公有成员,无法访问子类中的protected,当然private肯定也是是不行的
查看全部 -
子类实例化的对象不能操作父类中的protected成员
查看全部 -
当不涉及继承的时候:protected=private
公有继承public时:public继承到public下面
protected继承到protected下面
private继承到无法访问的区域
查看全部 -
虚继承的写法
查看全部 -
菱形继承的定义
查看全部 -
多继承的书写方式
查看全部 -
这三个类多继承
查看全部 -
这三个类互为多重继承
查看全部 -
`````````````````
查看全部
举报