【问题标题】:Can't acceed to a derivated class method无法访问派生类方法
【发布时间】:2017-11-28 14:44:34
【问题描述】:

我有这个代码:

struct A {
    void f();
};
struct B: A {
    void f(int i) { std::cout << "f(" << i << ")" << std::endl; }
};
int main()
{
    A* pa;
    pa = new B;
    pa->B::f(5);
}

我收到以下错误:

“B”不是“A”的基数

为什么会出现这个错误? 也许是因为我不能使用指针类型(A 类)(?)内的范围。 而且,为什么如果我删除 B:: 会出现以下错误?:

没有匹配的函数调用 A::f(int)

这是因为我无法通过 A 类型指针调用未在 A 类中定义的方法?但是这个指针指向一个 B 对象所以......我不明白这个,我是用 C++ 启动的 :(

对不起我的英语,谢谢大家

【问题讨论】:

  • 移动:“void f(int i) { std::cout A::f(5);”然后编译并运行它。想想刚刚发生的事情,看看你是在试图让逻辑基本上倒退......

标签: c++ class pointers inheritance virtual


【解决方案1】:

就编译器所知,pa 指向A 的一个实例,或除B 之外的某个类,它派生自A。它不会神奇地追踪每个指针的出处来确定pa 目前实际上恰好指向B

您可以通过演员表来判断:static_cast&lt;B*&gt;(pa)-&gt;f(5);


在一些相关的说明中,您的程序泄漏了内存。

【讨论】:

  • 知道了!谢谢,是的,我的程序泄漏了内存,我只是想做一个该错误的简短示例,我在更大的程序中得到了它,但感谢您的说明。
【解决方案2】:

这在 C++ 中是不可能的。 仅在 Class 上指定可能的 Class,当前 Class 派生自该 Class,如下例所示:

struct A {
    void f(int i) {}
};
struct B: A {
    void f(int i) { std::cout << "f(" << i << ")" << std::endl; }
};

int main()
{
    B* pa;
    pa = new B;
    pa->A::f(5);
}

或者你应该做以下事情:

struct A {
    void f(int i) {}
    virtual ~A() {}
};
struct B: A {
    void f(int i) { std::cout << "f(" << i << ")" << std::endl; }
};

int main()
{
    A* pa;
    pa = new B;
    B* pb = dynamic_cast<B*>(pa);
    if (pb) {
      pa->f(5);
    }
}

如果你想要多态行为,可以这样做:

struct A {
    virtual void f(int i) {}
};
struct B: A {
    virtual void f(int i) { std::cout << "f(" << i << ")" << std::endl; }
};

int main()
{
    A* pa;
    pa = new B;
    pa->f(5);
}

【讨论】:

  • 请注意,第一个示例将调用A::f,而不是B::f
  • op 的 A 的 f 不同
  • 而第二个例子根本无法编译:A 不是多态的,dynamic_cast 不能应用于它。
  • 这两个例子都明确调用A::f,但我相信OP想调用B::f
  • 好吧,现在它编译了,但仍然调用A::f。尚不清楚 dynamic_cast 舞蹈的目的是什么。
【解决方案3】:
A.f();

B.f(int i);

是完全不同的方法,因为它们与签名不匹配(注意 int i 参数)

所以你不能强制调用不存在的方法...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2014-06-22
    • 2021-11-19
    • 2012-04-28
    • 1970-01-01
    • 2015-05-29
    相关资源
    最近更新 更多