标签:
7.5.2虚基类
如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性。
如果在多条继承路径上有一个公共的基类,那么在继承路径的某处汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象。
要使这个公共基类在派生类中只产生一个子对象,必须对这个基类声明为虚继承,使这个基类称为虚基类。
虚继承声明使用关键字virtual
//1>main.cpp(60) : error C2385 : 对“num”的访问不明确
//1> main.cpp(60) : note : 可能是“num”(位于基“obj”中)
//1> main.cpp(60) : note : 也可能是“num”(位于基“obj”中)
1 #include <iostream> 2 3 class obj 4 { 5 public: 6 int num; 7 obj(int data):num(data) 8 { 9 std::cout << "obj create" << std::endl; 10 } 11 ~obj() 12 { 13 std::cout << "obj delete" << std::endl; 14 } 15 }; 16 17 class Aobj :public obj 18 { 19 public: 20 Aobj(int data) :obj(data) 21 { 22 std::cout << "Aobj create" << std::endl; 23 } 24 ~Aobj() 25 { 26 std::cout << "Aobj delete" << std::endl; 27 } 28 }; 29 30 class Bobj :public obj 31 { 32 public: 33 Bobj(int data) :obj(data) 34 { 35 std::cout << "Bobj create" << std::endl; 36 } 37 ~Bobj() 38 { 39 std::cout << "Bobj delete" << std::endl; 40 } 41 }; 42 43 class ABobj :public Aobj, public Bobj 44 { 45 public: 46 ABobj(int x, int y) :Aobj(x), Bobj(y) 47 { 48 std::cout << "ABobj create" << std::endl; 49 } 50 ~ABobj() 51 { 52 std::cout << "ABobj delete" << std::endl; 53 } 54 }; 55 56 void main() 57 { 58 ABobj *p = new ABobj(10, 20); 59 60 //std::cout << p->num; 61 62 //1>main.cpp(60) : error C2385 : 对“num”的访问不明确 63 //1> main.cpp(60) : note : 可能是“num”(位于基“obj”中) 64 //1> main.cpp(60) : note : 也可能是“num”(位于基“obj”中) 65 66 std::cout << p->Aobj::num << std::endl;//10 67 std::cout << p->Bobj::num << std::endl;//20 68 69 delete p; 70 71 system("pause"); 72 }
virtual
virtual
第8章 虚函数与多态性
多态性是指一个名字,多种语义;或界面相同,多种实现。
重载函数是多态性的一种简单形式。
虚函数允许函数调用与函数体的联系在运行时才进行,称为动态联编。
8.2 类指针的关系
8.3 虚函数与动态联编
8.4 纯虚函数与抽象类
8.5 虚函数和多态性的应用
小结
8.2 类指针的关系
基类指针和派生类指针与基类对象和派生类对象4种可能匹配:
直接用基类指针引用基类对象;
直接用派生类指针引用派生类对象;
用基类指针引用一个派生类对象;
用派生类指针引用一个基类对象;
8.3 虚函数与动态联编
8.4 纯虚函数与抽象类
8.5 虚函数和多态性的应用
小结
标签:
原文地址:http://www.cnblogs.com/denggelin/p/5668759.html