虚基类,该如何处理
虚基类
//如果一个派生类中有一个直接或间接的虚基类,那么派生类的构造函数
//的成员初始化列表必须列出对虚基类构造函数的调用。如果没有列出,
//则使用该虚基类的默认构造函数来初始化派生类对象的虚基类对象。
//这个是我总结的两句话:(假如各个派生类都有参数)
//A:就是如果一个派生类存在间接虚基类的话,虚基类中的构造函数应该是
//在派生类中显示列出来,而被调用。
//B:但是如果派生类中没有虚基类的话,应该是这个基类的直接派生类调用这个
//基类的构造函数,而不是这个基类的间接派生类去调用基类的构造函数。
//对于第二句话(其实这里写个类a继承类b,类b继承类c理解起来可能更好。
//看这个程序://基类child并没有调用base基类中的函数(呵呵调用了构造函数哦)
//所以没有二异性只不过child1和child2应该还是都拷贝了类base的成员
//如果对于上面这个不清楚去看看二异性是什么?
#include <iostream>
using namespace std;
class base
{
public:
base(int i):a(i)
{
cout < < "base= " < <i < <endl;
}
void print()
{
}
private:
int a;
};
class child1 : public base
{
public:
child1(int i):base(i)
{
cout < < "child1= " < <i < <endl;
}
private:
int b;
};
class child2: public base
{
public:
child2(int i):base(i)
{
cout < < "child2= " < <i < <endl;
}
private:
int c;
};
class child:public child1,public child2
{
public:
child(int a,int b):child1(a),child2(b)//,base(a)
{
cout < < "child= " < <a < <endl;
cout < < "child= " < <b < <endl;
}
private:
};
int main()
{
//child2 obj(2);
child obj(1,2);
return 0;
}
//对于A:看这个
#include <iostream>
using namespace std;
class base
{
public:
base(int i):a(i)
{
cout < < "base= " < <i < <endl;
//如果一个派生类中有一个直接或间接的虚基类,那么派生类的构造函数
//的成员初始化列表必须列出对虚基类构造函数的调用。如果没有列出,
//则使用该虚基类的默认构造函数来初始化派生类对象的虚基类对象。
//这个是我总结的两句话:(假如各个派生类都有参数)
//A:就是如果一个派生类存在间接虚基类的话,虚基类中的构造函数应该是
//在派生类中显示列出来,而被调用。
//B:但是如果派生类中没有虚基类的话,应该是这个基类的直接派生类调用这个
//基类的构造函数,而不是这个基类的间接派生类去调用基类的构造函数。
//对于第二句话(其实这里写个类a继承类b,类b继承类c理解起来可能更好。
//看这个程序://基类child并没有调用base基类中的函数(呵呵调用了构造函数哦)
//所以没有二异性只不过child1和child2应该还是都拷贝了类base的成员
//如果对于上面这个不清楚去看看二异性是什么?
#include <iostream>
using namespace std;
class base
{
public:
base(int i):a(i)
{
cout < < "base= " < <i < <endl;
}
void print()
{
}
private:
int a;
};
class child1 : public base
{
public:
child1(int i):base(i)
{
cout < < "child1= " < <i < <endl;
}
private:
int b;
};
class child2: public base
{
public:
child2(int i):base(i)
{
cout < < "child2= " < <i < <endl;
}
private:
int c;
};
class child:public child1,public child2
{
public:
child(int a,int b):child1(a),child2(b)//,base(a)
{
cout < < "child= " < <a < <endl;
cout < < "child= " < <b < <endl;
}
private:
};
int main()
{
//child2 obj(2);
child obj(1,2);
return 0;
}
//对于A:看这个
#include <iostream>
using namespace std;
class base
{
public:
base(int i):a(i)
{
cout < < "base= " < <i < <endl;