编译器一直在说'class A' has no member named 'foo'.
我试图使用带指针的派生类中的函数。这是我的代码:
class A{
.....
};
class B:public A{
virtual void foo() = 0;
};
class C:public B{
....
public:
void foo(){
....
}
};
我有一张名为A
的Table
指针表和尝试时
Table[j]->foo()
我收到编译器错误。
除了演员外我该怎么办?
您有编译错误,因为函数foo
未在类A
中声明。
您可以在A
中将其声明为纯虚拟,如下所示:
class A {
virtual void foo() = 0;
};
在派生类中,您不必将foo
声明为明确的virtual
。如果只有C
是一个具体的类,你根本不必在类foo
中声明B
。
如果您的示例如果您知道在A
指针数组中只有C类实例,则可以显式转换为指向C
的指针,但这是设计不佳的标志,我不推荐它:
static_cast<C*>(Table[j])->foo()
如果你有一个指向基类的指针并且想要访问派生类型的成员你必须进行转换,那么你有一个指向派生类型的指针,无论是在你的情况下,还是在你的情况下将foo()
添加为基础的虚拟成员。
class A
{ ... };
class B : public A:{
{
public:
virtual foo() { std::cout << "B::foo" << std::endl; }
};
class C : public B
{
public:
void foo() { std::cout << "C::foo" << std::endl;
};
...
A * arr[8];
for(int i = 0; 8>i; ++i)
arr[i] = new C;
((B*)arr[0])->foo(); // will print "C::foo\n"
但如果你将virtual void foo() = 0;
添加到A
然后你可以做arr[0]->foo()
它仍然会打印C::foo