标签:
多继承“
class 派生类名 : 访问控制 基类名1 , 访问控制 基类名2 , … , 访问控制 基类名n
{
数据成员和成员函数声明
};
1 class Base1 2 { public: 3 Base1(int x) { value = x ; } 4 int getData() const { return value ; } 5 protected: 6 int value; 7 }; 8 class Base2 9 { public: 10 Base2(char c) { letter=c; } 11 char getData() const { return letter;} 12 protected: 13 char letter; 14 }; 15 class Derived : public Base1, public Base2 16 { friend ostream &operator<< ( ostream &, const Derived & ) ; 17 public : 18 Derived ( int, char, double ) ; 19 double getReal() const ; 20 private : 21 double real ; 22 };
2.虚基类
的基类,则在对该基类中声明的名字进行访问时,可能产生
二义性。
例如:
1 class B { public : int b ;} ; 2 3 class B1 : public B { private : int b1 ; } ; 4 5 class B2 : public B { private : int b2 ; } ; 6 7 class C : public B1 , public B2 8 9 { public : int f ( ) ; private : int d ; } ; 10 11 12 13 /*C c ; 14 15 c . B ; // error 16 17 c . B :: b ; // error,从哪里继承的? 18 19 c . B1 :: b ; // ok,从B1继承的 20 21 c . B2 :: b ; // ok ,从B2继承的*/ 22 23 24 25 #include<iostream> 26 27 using namespace std ; 28 29 int main () 30 31 { C c ; 32 33 c . B1 :: b = 5 ; c . B2 :: b = 10 ; 34 35 cout << "path B1==> " << c . B1 :: b << endl ; 36 37 cout << "path B2==> " << c . B2 :: b << endl ; 38 39 }
建立 C 类的对象时,B 的构造函数将被调用两次:一次由B1调用,另一次由 B2 调用,以初始化 C 类的对象中所包含的两个 B 类的子对象
汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象。
要使这个公共基类在派生类中只产生一个子对象,必须对这个基类
声明为虚继承,使这个基类成为虚基类。
1 #include <iostream> 2 using namespace std; 3 4 //虚基类的测试 5 class A 6 { 7 public: 8 A(){ cout << "class a\n"; } 9 }; 10 11 //如果在此处不加上virtual关键字则会调用两次A类的构造函数 12 class B1:virtual public A 13 { 14 public: 15 B1(){ cout << "class b1\n"; } 16 }; 17 //如果在此处不加上virtual关键字则会调用两次A类的构造函数 18 class B2:virtual public A 19 { 20 public: 21 B2(){ cout << "class b2\n";} 22 }; 23 class C:public B1,public B2 24 { 25 public: 26 C(){ cout << "class C\n"; } 27 }; 28 void main() 29 { 30 C c; 31 }
标签:
原文地址:http://www.cnblogs.com/Smart-Du/p/4334051.html