class Base1 {// 二义性
public:
void print() {
}
};
class Base2 {
private:
void print(int i) {
}
};
class Derived : public Base1, public Base2 {
};
int main() {
Derived* d = new Derived();
/*
* 知识点:二义性
* 1. 即使两个继承的函数有不同的形参表,也会出错
* 2. 即使函数在一个类中是私有的,而在另外一个类中是公有或保护的
*/
//d->print(1); //error,
d->Base1::print(); // ok
return 0;
}
#include <iostream>
struct Base {
int Base_num;
Base(int b) : Base_num(b) {
std::cout << "Base_num" << std::endl;
}
};
struct Middle1 : virtual public Base {// 虚继承
int Middle1_num;
Middle1(int m, int b) :Middle1_num(m), Base(b) {
std::cout << "Middle1_num" << std::endl;
}
};
struct Middle2 : virtual public Base {// 虚继承
int Middle2_num;
Middle2(int m, int b) :Middle2_num(m), Base(b) {
std::cout << "Middle2_num" << std::endl;
}
};
struct Derived : public Middle1, public Middle2 {
Derived(int m1, int m2, int b1, int b) : Middle2(m1, b1), Middle1(m2, b1), Base(b) {// 知识点: 构造虚继承的对象
std::cout << "Derived" << std::endl;
}
};
int main() {
Derived* d = new Derived(1,2,3,4);
/* 打印内容:
* Base_num (只打印一次)
* Middle1_num(Middle1_num,Middle2_num 顺序取决于派生类列表中的顺序,而不是Derived的构造函数)
* Middle2_num
* Derived
*/
std::cout << d->Base_num << std::endl;
return 0;
}
struct Base1 {// 构造函数顺序
Base1() { std::cout << "Base1" << std::endl; }
};
struct Base2 {
Base2() { std::cout << "Base2" << std::endl; }
};
struct Base3 {
Base3() { std::cout << "Base3" << std::endl; }
};
struct Middle1 : virtual public Base1 { // 虚继承
Middle1() { std::cout << "Middle1" << std::endl; }
};
struct Middle2 : public Base2 {
Middle2() { std::cout << "Middle2" << std::endl; }
};
struct Derived1:public Middle2, public Middle1, virtual Base3 {
};
int main() {
/*
* 知识点: 无论虚基类出现在继承层次中的任何地方,总是在构造非虚基类之前构造虚基类
* 构造顺序
* Base1()
* Base3()
* Base2()
* Middle2()
* Middle1()
*/
Derived1 d;
return 0;
}