无法加入派生类方法

时间:2017-06-25 16:13:04

标签: c++ class pointers inheritance virtual

我有这段代码:

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 :: i会出现以下错误?:

  

没有用于调用A :: f(int)

的匹配函数

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

对不起我的英文,感谢所有人

3 个答案:

答案 0 :(得分:1)

对于所有编译器都知道,pa指向A的实例,或者从B派生的A以外的某个类。它并没有神奇地追踪每个指针的出处,以确定pa实际上恰好指向B

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

在某种程度上相关的说明,你的程序会泄漏内存。

答案 1 :(得分:0)

在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);
}

答案 2 :(得分:0)

A.f();

B.f(int i);

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

所以你不能强制转换为不存在的方法......