虚基类(virtual base class)
来源:互联网 发布:ps美工软件 编辑:程序博客网 时间:2024/05/16 13:59
声明虚基类的一般形式为:
class 派生类名 : virtual 继承方式 基类名
经过这样的声明后,当基类通过多条派生路径被一个派生类继承时,该派生类只继承该派生类一次,也就是说,基类成员只保留一次。为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类,否则仍然会出现对基类的多次继承
规定:在最后的派生类中不仅要负责对其直接基类进行初始化,还要负责对虚基类初始化
C++编译系统只执行最后的派生类对虚基类的构造函数的调用,而忽略虚基类的其他派生类对虚基类的构造函数的调用,这就保证了虚基类数据成员不会被对此初始化
1 #include <iostream>2 #include <string>3 4 using namespace std;5 6 //声明公共基类Person7 class Person8 {9 public:10 Person(string nam , char se , int a)11 {12 name = nam ; 13 sex = se ;14 age = a ;15 }16 protected:17 string name ; 18 char sex ;19 int age ;20 };21 22 //声明Person的直接派生类Teacher23 class Teacher : virtual public Person //声明Person为公共继承的虚基类24 {25 public:26 Teacher(string nam , char se , int a , string ti) : Person(nam , se , a) 27 {28 title = ti ;29 }30 protected:31 string title ;32 };33 34 //声明Person的直接派生类Student35 class Student : virtual public Person //声明Person为公共继承的虚基类36 {37 public:38 Student(string nam , char se , int a , float sco) : Person(nam , se , a) , score(sco) {}39 protected:40 float score ;41 };42 43 //声明多重继承的派生类Graduate44 class Graduate : public Teacher , public Student45 {46 public:47 Graduate(string nam , char se , int a , string ti , float sco , float wa) : Person(nam , se , a) , Teacher(nam , se , a , ti) , Student(nam , se , a , sco) , wage(wa) {}48 void show()49 {50 cout << "name :" << name << endl ;51 cout << "sex :" << sex << endl ;52 cout << "age :" << age << endl ;53 cout << "title :" << title << endl ;54 cout << "score :" << score << endl ;55 cout << "wage :" << wage << endl ;56 }57 private:58 float wage ;59 };60 61 //主函数62 int main(void)63 {64 Graduate grad("Wangli" , 'f' , 24 , "assistant" , 89.6 , 2000.6);65 grad.show();66 return 0 ;67 }
在Graduate类中,只保留一份基类的成员,因此可以用Graduate类中的show函数引用Graduate类对象中的公共基类Person的数据成员name , sex , age 的值,不需要加基类名和域运算符 '' :: '' ,不会产生二义性。
- 虚基类(virtual base class)
- virtual base class(虚基类)
- 虚基类(virtual base class)
- 虚基类(Virtual Base Class)
- C++虚基类(virtual base class)
- virtual base class
- virtual base class的问题
- 关于Virtual Base Class的几点说明
- the memory of virtual base class of C++
- Prefer to make base class virtual functions private
- 条款二十四:了解virtual functions、multiple inheritance、virtual base class、runtime type identification的成本
- Base Class
- virtual base classes
- C# virtual, base, override
- 读书笔记: effetive C++ 条款14:总是让base class拥有virtual desctructor , 体现了virtual对多态的支持
- Why does a destructor in base class need to be declared virtual?
- C++ - 纯虚函数(pure virtual) 和 抽象基类(abstract base class)
- c++中包含empty virtual base class 类的sizeof结果分析
- 左旋转字符串
- 计算机基本知识
- java.lang.NullPointerException at org.apache.struts.config.FormBeanConfig.createActionForm(FormBe
- easy to use AJAX libraries for django
- 通三个提示来控制HASH_JOIN顺序和内建与探测表
- 虚基类(virtual base class)
- 堆和栈的区别
- 权限系统概要
- ZOJ、POJ题目大体分类
- Tomcat version * only supports J2EE * Web modules
- 关于fread读数据诡异的问题
- PING命令入门详解
- 修改Oracle连接数
- 东纶化验室