#include<iostream>
using namespace std;
class Base{
private:
int a;
protected:
Base(){};
virtual ~Base(){};
};
class Derived:private Base{
private:
int b;
public:
Derived(){};
~Derived(){};
void test(){
Base world;
};
};
int main(){
}
inherit.cc | 7 col 3 |错误:'Base :: Base()'受到保护 inherit.cc | 17 col 9 |错误:在此背景下 inherit.cc | 8 col 11 |错误:'virtual Base :: ~Base()'受到保护 inherit.cc | 17 col 9 |错误:在此上下文中
但为什么?
为什么这是正确的?
#include<iostream>
using namespace std;
class Base{
private:
int a;
protected:
Base(){};
virtual ~Base(){};
void test2(){};
};
class Derived:private Base{
private:
int b;
public:
Derived(){};
~Derived(){};
void test(){
test2();
};
};
int main(){
}
答案 0 :(得分:2)
在第一个示例中,您在Base
类的方法test()
中创建了Derived
的对象。
在第二个示例中,您可以访问test2()
中的protected
方法Base
。 Derived
private
来自Protected
。
请注意类的访问说明符规则:
Protected
访问说明符意味着声明为private
的成员只能从类BUT外部访问,而只能从派生自它的类中访问。
如果是Derived
继承:
基类的所有公共成员都成为派生类的私人成员&amp;
基类的所有受保护成员都成为派生类的私有成员。
在例1中,
尽管Base
来自Base
,但它只能为Base
成员函数Derived
的{{1}}访问test()
的受保护成员。{{ 1}})被调用的不是任何其他Base
类对象
鉴于您无法创建Base
对象。
在例2中,
在调用其成员函数(test2()
)的对象上调用test()
,如上所述Derived
类可以访问protected
Base
成员Base
对象的Derived
,其成员函数被调用,因此可以调用test2()
。
好读:
What are access specifiers? Should I inherit with private, protected or public?
答案 1 :(得分:0)
在void Derived::test()
中,您尝试创建Base类的实例。因为没有关于参数的说法 - 它试图调用Base默认构造函数,但它是protected
- 而不是public
。
同样在Derived::test()
的末尾将被称为析构函数,但它也受到保护。因此,您无法使用构造函数和析构函数
Base
类的实例
答案 2 :(得分:0)
#include<iostream>
using namespace std;
class Base{
private:
int a;
protected:
Base(){}
Base(int a) : a(a) {}
virtual ~Base(){}
void test2(){}
};
class Derived:private Base{
private:
int b;
Derived(int b) : Base(b) {};
public:
Derived() : Base() {}; // uses protected constructor
~Derived(){};
Base* test(){
new Derived(-1); // uses the other protected constructor
};
};