class A
{
public:
A(int a) :m_a(a) {}
int getMa() { return m_a; }
private:
int m_a;
};
class B :public A
{
public:
B(int a, int b) :A(a), m_b(b) {}
private:
int m_b;
};
class C :public A
{
public:
C(int a, int c) :A(a), m_c(c) {}
private:
int m_c;
};
class D :public B, public C
{
public:
D(int a, int b, int c, int d) :B(a, b), C(a, c), m_d(d) {}
void func()
{
/*错误,访问不明确
std::cout << getMa();*/
//正确,通过B访问getMa()
std::cout << B::getMa();
}
private:
int m_d;
};
class ZooAnimal {}; //虚基类class Bear :public virtual ZooAnimal {}; //虚继承class Raccoon :public virtual ZooAnimal {}; //虚继承
//Panda只保存一份ZooAnimal的定义class Panda :public Bear, public Raccoon, public Endangered {};
class A {};
class B: publi A {};
class C: publi A {};
class D: public B, public C {};
int main()
{
D d;
A* pa = &d; //错误
return 0;
}
class ZooAnimal {};
class Bear :public virtual ZooAnimal {};
class Raccoon :public virtual ZooAnimal {};
class Panda :public Bear, public Raccoon, public Endangered {};
void dance(const Bear&);
void rummage(const Raccoon&);
ostream& operator<<(ostream&, const ZooAnimal&);
int main()
{
Panda ying_yang;
dance(ying_yang); //正确,把一个Panda对象当成Bear传递
rummage(ying_yang);//正确,把一个Panda对象当成Raccoon 传递
cout << ying_yang; //正确,把一个Panda对象当成ZooAnimal传递
return 0;
}
//普通继承
class A {
public:
A(int a);
};
class B :public A {
public:
B(int a):A(10) {}
};
class C :public B {
public:
C() :B(10) {} //可以不为A进行构造,因为A的构造已经交给B了
};
//虚继承
class A {
public:
A(int a);
};
class B :virtual public A {
public:
B(int a):A(10) {}
};
class C :virtual public A {
public:
C(int a) :A(10) {}
};
class D :public B,public C {
public:
//D() :B(10), C(20) {} 错误的,必须显式为A进行构造
D() :A(5), B(10), C(20) {} //正确
};
class Character {};
class BookCharacter :public Character {};
class ZooAnimal {};
class Bear :public virtual ZooAnimal {};
class ToyAnimal {};
class ReddyBear :public BookCharacter, public Bear,
public virtual ToyAnimal {};