相关疑难解决方法(0)

C++继承 - 难以访问的基础?

我似乎无法使用基类作为函数参数,我是否搞砸了我的继承?

我的主要内容如下:

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)

这应该不起作用吗?我似乎无法在我的主要功能中进行该调用

c++ inheritance

137
推荐指数
2
解决办法
9万
查看次数

继承:'A'是'B'无法访问的基础

$ 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++ inheritance

77
推荐指数
4
解决办法
7万
查看次数

C++名称解析(和重载)规则列表

在哪里可以找到符合C++的编译器必须应用的规则列表才能执行名称解析(包括重载)?

我喜欢自然语言算法或流程图.

C++标准当然有这套规则,但随着新语言语句的引入而逐渐形成,结果很难记住.

总而言之,我想知道" 当它看到名字'A'时编译器会做什么的完整而详细的答案?"

我知道C++就是" 我们在X时这样做,但如果Z持有则不是Y "所以,我在问是否有可能使它更加线性.

编辑:我正在研究这个主题的草稿,一旦发布,可以集体改进.然而,这些天我很忙,可能需要时间来宣传一些东西.如果有兴趣我会将"关于原始txt文件的个人笔记"推广到更好的东西并发布.

c++ rules token-name-resolution

40
推荐指数
1
解决办法
4172
查看次数

为什么derived*to base*之间的转换会因私有继承而失败?

这是我的代码 -

#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()为什么我会收到此错误?有人可以解释一下.

c++ private derived base accessible

20
推荐指数
5
解决办法
2万
查看次数

C++中的私有基类可访问性

我最近不得不这样做:

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

c++

5
推荐指数
1
解决办法
781
查看次数