无法访问派生的 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 参数)
所以你不能转换为调用不存在的方法...
我有这个代码:
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 参数)
所以你不能转换为调用不存在的方法...