我似乎无法使用基类作为函数参数,我是否搞砸了我的继承?
我的主要内容如下:
int some_ftn(Foo *f) { /* some code */ };
Bar b;
some_ftn(&b);
Run Code Online (Sandbox Code Playgroud)
并且以这种方式继承自Foo的类Bar:
class Bar : Foo
{
public:
Bar();
//snip
private:
//snip
};
Run Code Online (Sandbox Code Playgroud)
这应该不起作用吗?我似乎无法在我的主要功能中进行该调用
$ cat inheritance.cpp
#include <iostream>
using namespace std;
class A { };
class B : private A { };
int main() {
A* ab = new B;
}
$
$ g++ inheritance.cpp
inheritance.cpp: In function 'int main()':
inheritance.cpp:9: error: 'A' is an inaccessible base of 'B'
$
Run Code Online (Sandbox Code Playgroud)
我只是不明白这个错误.
据我所知,正如本教程所证实的那样,private继承只应改变class B外部世界可见成员的方式.
我认为私有说明者所做的不仅仅是改变class B成员的可见性.
在哪里可以找到符合C++的编译器必须应用的规则列表才能执行名称解析(包括重载)?
我喜欢自然语言算法或流程图.
C++标准当然有这套规则,但随着新语言语句的引入而逐渐形成,结果很难记住.
总而言之,我想知道" 当它看到名字'A'时编译器会做什么的完整而详细的答案?"
我知道C++就是" 我们在X时这样做,但如果Z持有则不是Y "所以,我在问是否有可能使它更加线性.
编辑:我正在研究这个主题的草稿,一旦发布,可以集体改进.然而,这些天我很忙,可能需要时间来宣传一些东西.如果有兴趣我会将"关于原始txt文件的个人笔记"推广到更好的东西并发布.
这是我的代码 -
#include<iostream>
using namespace std;
class base
{
public:
void sid()
{
}
};
class derived : private base
{
public:
void sid()
{
}
};
int main()
{
base * ptr;
ptr = new derived; // error: 'base' is an inaccessible base of 'derived'
ptr->sid();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这给出了编译时错误.
error: 'base' is an inaccessible base of 'derived'
Run Code Online (Sandbox Code Playgroud)
由于编译器将尝试调用基类,sid()为什么我会收到此错误?有人可以解释一下.
我最近不得不这样做:
class A { };
class B : private A { };
class C : public B {
public:
A *myA;
};
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在尝试的三个编译器中出错了.当我改变宣言时myA,::A *myA一切正常.我在C++标准中探讨过,发现了第11.2节第3段,它说:
注意:私有基类的成员可能无法作为继承的成员名称访问,但可以直接访问.
哪个是相关的,但不清楚.为什么名称A无法访问?如果A没有隐藏会出现什么问题?
谢谢,
-Ben