C++_Primer_chapter17 3.多重继承与虚继承

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值