无法访问派生的 class 方法

Can't acceed to a derivated class method

我有这个代码:

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' is not a base of 'A'

为什么会出现此错误? 也许是因为我不能使用指针类型 (class A)(?) 内的作用域。 而且,为什么如果我删除 B:: 我会收到以下错误?:

No matching function for call to A::f(int)

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

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

就编译器所知,pa 指向 A 的一个实例,或者 A 派生的 B 以外的某些 class。它并没有神奇地追踪每个指针的出处以确定 pa 此时实际上恰好指向 B

虽然你可以用演员来告诉它:static_cast<B*>(pa)->f(5);


在某种程度上相关的注释中,您的程序泄漏了内存。

在C++中是不可能的。 指定 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(int i);

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

所以你不能转换为调用不存在的方法...