C++多继承和多态
一、多继承
class Animal{
public:
int age;
};
class Sheep: public Animal{}; // 羊类
class Tuo: public Animal{}; // 驼类
class SheepTuo: public Sheep, public Tuo{}; //羊驼类
void test01(){
SheepTuo st;
st.age::Sheep = 10;
st.age::Tuo = 20;
cout << st.age::Sheep << st.age::Tuo << endl;
}
多继承会有一个问题,羊驼类继承了两个age属性,浪费了内存
解决办法:在继承类的前面加上 virtual 关键字,该类就变成了虚基类,虚基类保存的只是一个指针,指针指向的是基类的成员
class Animal{
public:
int age;
};
class Sheep: virtual public Animal{}; // 羊类
class Tuo: virtual public Animal{}; // 驼类
class SheepTuo: virtual public Sheep, virtual public Tuo{}; //羊驼类
void test01(){
SheepTuo st;
st.age = 23;
cout << st.age<< endl;
}
1. 纯虚函数(Java里的接口)
virtual void say() = 0;
如果父类有纯虚函数,子类继承了就必须要实现
如果父类含有纯虚函数,该父类就无法实现化对象了,该类为抽象类
2. 虚函数
父类的方法用 virtual 修饰,子类的方法会覆盖掉父类的该方法,*防止调用子类的方法时调用父类的方法
3. 类模板
template<class Name,class Age>
class 的参数会根据传过来的值分析,转化成对应的数据类型,自定义除外
4. 类外部实现成员函数
template <class T1, class T2>
class Person{
public:
Person(T1 name, T2 age);
void showPerson();
T1 m_Name;
T2 m_Age;
};
template <class T1, class T2>
Person<T1,T2>::Person(T1 name, T2 age){
this->m_Name = name;
this->m_Age = age;
}
template <class T1, class T2>
void Person<T1, T2>::showPerson(){
cout << "name is:" << this->m_Name << " age is:" << this->m_Age << endl;
}
二、 多态
多态成立条件:
- 有继承
- 子类重写父类的 virtual(虚函数)
- 父类的指针指向子类的实例
多态存在的问题:
- 父类的方法用virtual修饰,子类的方法会覆盖父类的方法,防止调用子类的方法时调用父类的方法
- 成员函数一开始不会创建出来,而是在运行的时候创建(非问题)
- 父类中含有类模板,子类在继承时必须告诉子类数据类型,否则无法分配内存