1. 在多重继承中,如果一个类同时继承两个类 class A和class B, 而class A和B 中都有一个叫 foo() 的函数,如何明确地在子类中指出override哪个父类的foo() ?
需要明确的指明 父类 的名字,如: C.A::foo(), C.B::foo().
2.在多重继承中, 比如三级, 同时又存在虚函数, 那么会有 "覆盖" 发生, 并且其原则是: 如果父辈存在相关接口则优先调用父辈接口,如果父辈也不存在相关接口,则调用祖父辈接口.
3. C++类在继承的时候,默认的是私有继承,私有继承是无法继承并使用父类函数中的公用变量的. 因此, 在需要的时候,一定要加上public 关键字: class Derive: Base -> class Derive: public Base.
(由于私有继承和保护继承 使得派生对象的子类对象 访问基类的时候,限制重重, 有些人认为, 他们仅仅是在技术讨论上才有其一席之地)
4. 当基类的构造函数含有参数的时候, 若子类继承他,则需要显式的调用 基类的构造函数以完成初始化. 例如:
class base
{
protected : int i;
public: base(int x){i = x;}
};
class derived : public base
{
private : int i;
public: derived(int x,int y):base(x) //必须能保证base类型可以顺利的构造,否则会报错!
{i = y;}
void printTotal()
{
int total = i + base::i;
cout << total <<endl;
}
};
5.在计算继承类所占的字节数的时候,有如下规则:
(1), 如果类中有虚函数(有一个或多个的情况是一样的), 那么该类除了成员占用字节数外,还要多加 4 (虚函数指针)
(2) 如果基类有虚函数, 继承类 在 非虚拟继承的时候, 继承类的大小是基类大小(包括虚函数指针), 加上 本身数据成员的大小. 而 继承类本身的虚 函数指针大小不再重复记入.
(3)如果继承类是 虚拟继承, 那么在前面计算的基础上, 每一级的继承类都要多加四个字节(是虚类指针大小)!
例子:
class A{
public:
char k[3];
virtual void aa() {};
virtual void aaa() {};
}; // 大小为 8字节
class B:public virtual A{
public:
char bk[3];
int a;
virtual void bb() {};
};// B的大小为 8(A的大小) + 8(成员变量字节数) + 4 (虚类指针大小)
class C:public B{
public:
char ik[3];
virtual void cc() {};
};// C的大小为 20(B的大小) + 4(成员变量字节数)
关于C++继承(多重继承)
最新推荐文章于 2022-06-16 18:31:27 发布