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
- objective-c中继承
- C#中类的继承
- c ++中继承问题小结
- c+中继承的使用
- C++-虚继承
- C++【多重继承和虚继承】
- (C++)继承、菱形继承和虚继承的那些事儿
- [C++]关于C++中继承、重载、掩盖
- [C++]关于C++中继承、重载、掩盖
- 如何在C#中实现继承?
- C++中私有继承实例
- [C++]关于C++中继承、重载、掩盖
- 【Objective-C】OC中类的继承
- object-c中类的继承
- C语言中 继承与派生
- C#中继承的代码实现方法。
- C++中虚继承
- c++中虚继承
- codeforces 343 D. Water Tree (树链剖分)
- opencv合并图片
- array easy summery
- 在IDEA中实战Git
- 道和开发笔记
- C++中虚继承
- 资深linux 马哥视频
- java学习第六天之构造函数
- Petr and a calendar_Codeforces
- 关于jQuery配合CSS3实现背景图片滑动实例
- Oracle Data Integrator 12cR1 (12.1.3.0.0)安装过程
- 符号表
- nginx负载均衡-5种策略
- 模拟下拉框选择对应菜单的内容