重载基类的方法
如果要使用基类的方法,可以用作用域解析运算符(::)
class A {
public:
void info() {
cout << this->x << endl;
}
};
class B : public A {
public:
void info() { // 重载基类的方法
cout << "B: " << this->x << ", " << this->y << endl;
A::info(); // 使用基类的方法
}
};
int main(int argc, char const *argv[])
{
B* b = new B(3, 4);
b->info();
delete b;
return 0;
}
A constructor
B constructor
B: 3, 4 // 调用派生类的info()
A: 3 // 调用基类的info()
B destructor
A destructor
隐藏基类的方法
class A {
public:
void info() {
cout << "A: " << this->x << endl;
}
void info(int val) {
cout << "A: receive " << val << endl;
}
};
class B : public A {
public:
void info() {
cout << "B: " << this->x << ", " << this->y << endl;
}
};
int main(int argc, char const *argv[])
{
B* b = new B(3, 4);
b->info(34); // error,B中没有实现info(int val)
delete b;
return 0;
}
派生类中实现了info()
,他隐藏了基类A::info()
的所有版本,编译器调用了派生类的info()
,但他没有接受参数,也就会出错
解决方法
- 在
main()
中使用作用域解析运算符b->A::info(34);
- 在派生类中使用
using
关键字using A::info;
- 重载基类的所有info方法
void info() { cout << "B: " << this->x << ", " << this->y << endl; } void info(int val) { cout << "B: receive " << val << endl; }
私有继承
公有继承派生类在继承结构层次外部可以使用基类的公有和保护成员,如b->g()
私有继承则表示,基类的公有和保护成员,只能在派生类内部使用,外部无法访问
class A {
public:
virtual void f() = 0;
void g() { this->f(); }
};
class B : private A {
public:
void f() {
cout << "B: f(" << this->x << ", " << this->y << ")" << endl;
}
private:
int y;
};
int main(int argc, char const *argv[])
{
B* b = new B(3, 4);
b->g(); // error,私有继承不能访问基类的成员函数
}
保护继承
class A {
public:
virtual void f() = 0;
void g() { this->f(); }
};
class B : public A {
public:
void f() {
cout << "B: f(" << this->x << ", " << this->y << ")" << endl;
}
};
class C : protected B {
void func() {
this->g();
}
};
C类想访问A类的成员方法,如果B对A是私有或保护继承,C类是无法访问A类的成员方法的
只有B类对A类是公有继承,C类才能访问A类的成员方法
总结
- 如果是
is-a
关系,即属于关系,要用公有继承 - 如果是
has-a
关系,即拥有关系,要用私有或保护继承 public
的限制最小,可以被类成员函数、派生类成员函数、友元访问,类对象也可以访问protected
有点限制,可以被类成员函数、派生类成员函数、友元访问,类对象不能访问private
限制最大,可以被类成员函数、友元访问,派生类、类对象都不能访问
三个访问限定符的区别
类型 | 类成员函数 | 友元 | 派生类成员函数 | 类对象 |
---|---|---|---|---|
public | yes | yes | yes | yes |
protected | yes | yes | yes | no |
privated | yes | yes | no | no |