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;
}

二、 多态

多态成立条件:

  1. 有继承
  2. 子类重写父类的 virtual(虚函数)
  3. 父类的指针指向子类的实例

多态存在的问题:

  1. 父类的方法用virtual修饰,子类的方法会覆盖父类的方法,防止调用子类的方法时调用父类的方法
  2. 成员函数一开始不会创建出来,而是在运行的时候创建(非问题)
  3. 父类中含有类模板,子类在继承时必须告诉子类数据类型,否则无法分配内存
posted @ 2020-10-24 09:00  MAOCE  阅读(230)  评论(0)    收藏  举报