C++中虚继承

来源:互联网 发布:网络拾音头 编辑:程序博客网 时间:2024/06/01 08:00

为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。
class 派生类名:virtual 继承方式 基类名
virtual是关键字,声明该基类为派生类的虚基类。
在多继承情况下,虚基类关键字的作用范围和继承方式关键字相同,只对紧跟其后的基类起作用。
声明了虚基类之后,虚基类在进一步派生过程中始终和派生类一起,维护同一个基类子对象的拷贝

#include<iostream>using namespace std;int gFlag = 0;class Base{public:    Base()    {         cout << "Base called : " << gFlag++ << endl;     }    void print()    {         cout << "Base print" << endl;     }};class Mid1 : virtual public Base{public:    Mid1()    {         cout << "Mid1 called" << endl;     }};class Mid2 : virtual public Base{public:    Mid2()    {         cout << "Mid2 called" << endl;     }};class Child :public Mid1, public Mid2{public:    Child()    {         cout << "Child called" << endl;     }};int main(){    Child d;    d.print();}

基类某函数声明virtual,所有派生类中和它同名同参数都会自动变成虚函数

#include<iostream>using namespace std;class A{public:    void foo()    {        cout << "1" << endl;    }    virtual void fun()    {        cout << "2" << endl;    }};class B :public A{public:    void foo()    {        cout << "3" << endl;    }    void fun()    {        cout << "4" << endl;    }};void main(){    A a;    B b;    A *p = &b;    p->foo();    p->fun();    B* ptr = (B*)&a;    ptr->foo();    ptr->fun();}

//1432
目的:1.在函数比较多的情况下可以提示读者某个函数重写了基类虚函数(表示这个虚函数是从基类继承,不是派生类自己定义的);2.强制编译器检查某个函数是否重写基类虚函数,如果没有则报错。

class Base{    virtual void f()    {        cout << "Base" << endl;    }    void F()    {    }};class Derived :public Base{    void f() override    {        cout << "Dervied" << endl;    }    void F() override//错误    {    }};
0 0
原创粉丝点击