【发布时间】:2017-07-18 11:47:12
【问题描述】:
我创建了一个类,它是指向基类的指针的容器。我可以添加基类对象以及派生类对象。但是,当我尝试使用派生类对象中的函数时,出现编译错误“'Base' class has not member named 'name'”。 代码如下:
#include <cstdio>
#include <vector>
using namespace std;
enum Type{
obj,
obj1,
obj2
};
class Base{
public:
void fun(){
printf("I'm base\n");
}
};
class Derived1 : public Base{
public:
void fun2(){
printf("I'm derived1\n");
}
};
class Derived2 : public Base{
public:
void fun3(){
printf("I'm derived2\n");
}
};
class myVector{
private:
vector<Base*> objects;
public:
void add(Type type){
switch(type){
case obj:
objects.push_back(new Base);
break;
case obj1:
objects.push_back(new Derived1);
break;
case obj2:
objects.push_back(new Derived2);
break;
}
}
Base* operator[](unsigned index){
return objects[index];
}
};
int main(){
myVector vec;
vec.add(obj);
vec.add(obj1);
vec.add(obj2);
vec[0]->fun(); // ok
vec[1]->fun1(); // error "Base" has not member named "fun1"
vec[2]->fun2(); // error "Base" has not member named "fun2"
}
应该打印出来
我是基地
我是派生的1
我是派生2
但我在 cmets 中的代码中出现编译错误
【问题讨论】:
-
函数名
fun2和fun3不能通过Base*访问。 -
如果要通过基类指针调用函数,必须在基类中声明。
-
您当然可以
static_cast<Derived1*>(vec[1])->fun1()- 但这通常表明您在设计类层次结构时出错了。您需要以不同的方式处理子类,是否有一个很好的现实原因,而这不是用虚拟方法解决的?
标签: c++ pointers inheritance derived-class base-class