class ZooAnimal {}; //动物
class Endangered {}; //濒临灭绝的动物
class Bear :public ZooAnimal {}; //熊
//多重继承
class Panda :public Bear, public Endangered {}; //熊猫
class Panda :public Bear, public Endangered {
public:
//构造所有基类
Panda(std::string name, bool onExhibit)
:Bear(name, onExhibit, "Panda"),
Endangered(Endangered::cirtical)
{
}
//使用Bear的默认构造函数初始化Bear对象
Panda::Panda()
: Endangered(Endangered::cirtical)
{
}
};
struct Base1 {
Base1() = default;
Base1(const std::string&);
Base1(std::shared_ptr<int>);
};
struct Base2 {
Base2() = default;
Base2(const std::string&);
Base2(int);
};
//多重继承
struct D1 :public Base1, public Base2 {
//使用using继承基类中的构造函数
using Base1::Base1;
using Base2::Base2; //会产生错误
};
struct Base1 {
Base1() = default;
Base1(const std::string&);
Base1(std::shared_ptr<int>);
};
struct Base2 {
Base2() = default;
Base2(const std::string&);
Base2(int);
};
struct D1 :public Base1, public Base2 {
using Base1::Base1;
using Base2::Base2;
//覆盖两个基类的const std::string&参数构造函数版本
D1(const std::string &s):Base1(s), Base2(s){}
D1() = default; //一旦定义了自己的构造函数,则必须出现
};
使用非合成版本
使用合成版本
class ZooAnimal {};
class Endangered {};
class Bear :public ZooAnimal {};
class Panda :public Bear, public Endangered {};
void print(const Bear&);
void highlight(const Endangered&);
ostream& operator<<(ostream&, const ZooAnimal&);
int main()
{
Panda ying_yang("ying_yang");
print(ying_yang); //将一个Panda对象传递给一个Bear引用
highlight(ying_yang); //将一个Panda对象传递给一个Endangered引用
cout << ying_yang << endl;//将一个Panda对象传递给一个ZooAnimal引用
return 0;
}
class ZooAnimal {};
class Endangered {};
class Bear :public ZooAnimal {};
class Panda :public Bear, public Endangered {};
void print(const Bear&);
void print(const Endangered&);
int main()
{
Panda ying_yang("ying_yang");
print(ying_yang);//产生二义性
return 0;
}
class ZooAnimal {
public:
virtual void print(); //1
virtual ~ZooAnimal();
};
class Endangered {
public:
virtual void print(); //1
virtual void highlight(); //2
virtual ~Endangered();
};
class Bear :public ZooAnimal {
public:
virtual void print(); //1
virtual void toes(); //3
};
class Panda :public Bear, public Endangered {
public:
virtual void print(); //1
virtual void highlight(); //2
virtual void toes(); //3
virtual void cuddle(); //4
};
int main()
{
Bear *pb = new Panda("ying_yang");
pb->print(); //正确,调用Panda::print()
pb->cuddle(); //错误,不属于Bear接口
pb->highlight(); //错误,不属于Bear接口
delete pb; //正确,调用Panda::~Panda()
return 0;
}
int main()
{
Endangered *pb = new Panda("ying_yang");
pb->print(); //正确,调用Panda::print()
pb->toes(); //错误,不属于Endangered的接口
pb->cuddle(); //错误,不属于Endangered的接口
pb->highlight();//正确,调用Panda::highlight
delete pb; //正确,调用Panda::~Panda()
return 0;
}
class A {
public:
int num;
};
class B {
public:
int num;
};
//允许多重继承
class C :public A, public B {};
int main()
{
C c;
c.num; //错误,对num地调用产生二义性
return 0;
}
class A {
public:
int num;
};
class B {
public:
int num;
};
class C :public A, public B {
public:
int num; //覆盖
};
int main()
{
C c;
c.num; //正确
return 0;
}
class A {
public:
int num;
};
class B {
public:
int num;
};
class C :public A, public B {};
int main()
{
C c;
c.A::num; //调用A中的num
c.B::num; //调用B中的num
return 0;
}
class A {
protected:
int num; //不能是private的,否则派生类不可访问
};
class B {
protected:
int num; //不能是private的,否则派生类不可访问
};
class C :public A, public B {
int max_numconst()const{
return std::max(A::num, B::num);
}
};