我有这段代码:
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 ++开始的:(
对不起我的英文,感谢所有人
答案 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参数)
所以你不能强制转换为不存在的方法......