一、成员函数
1、对象能确定所属类
①基类和派生类有同名函数:调用离对象最近的那个
②只有基类有该函数:调用基类的函数
class student
{
void calctuition();
};
class graduateStudent : public student
{
public:
void calctuition();
};
int main()
{
studnet s;
graduateStudent gs;
s.calctuition(); // 调用student::calctuition();
gs.calctuition(); // 调用graduateStudent::calctuition();
}
2、对象不能确定所属类(动态联编)
class student
{
virtual void calctuition(); // 基类的形状与派生类要一模一样(返回值类型、参数、函数名),否则不构成动态联编
};
class graduateStudent : public student
{
public:
virtual void calctuition();
};
void func(studnet &s) // 对象所属类编译时无法确定,用虚函数动态联编
{
s.calctuition();
// s == s时,调用student::calctuition();
// s == gs时,调用graduateStudent::calctuition();
}
int main()
{
studnet s;
graduateStudent gs;
func(s);
func(gs);
}
二、类
当一个类继承了有共同基类的类时, 由于二义性,在继承时需要对共同基类进行虚拟继承
1、实现
2、虚拟继承的构造函数 // 虚基类优先构造
class furnitur
{
public:
furniture(int a);
};
class bed : virtual public furniture
{
public:
bed(int a) : furniture(a);
};
class sofa : virtual public furniture
{
sofa(int a) : furniture(a);
};
class sleeperSofa : public bed, public sofa
{
sleeperSofa(int a) : bed(a), sofa(a), furniture(a); // 共同拥有的同时传给积累
};
int main()
{
sleeperSofa ss(20);
// sleeperSofa *p = new sleeperSofa(20);
}