C++从实现的虚拟类调用非虚方法
我有一个也有一个正常方法的接口,那么我该如何调用呢?C++从实现的虚拟类调用非虚方法
class Animal{
virtual void virtualFunction()=0;
}
class Cow : Animal{
virtual void virtualFunction(){}
void nonVirtualFunction(){}
}
class main{
Animal *a = new Cow();
a->virtualFunction();
}
^:这工作,但是当我做...
a->nonVirtualFunction();
它说,类动物没有这种方法,我知道ofcourse, 但什么方法最好称之为方法?
如果你要调用一个函数是Cow
成员,不要将其存放在多态Animal
指针摆在首位:
Cow* c = new Cow();
c->nonVirtualFunction();
它没有意义的存储如果您打算以Cow
特定的方式使用它,请在中输入Animal*
。
您可以使用dynamic_cast
在运行时检查动态类的一个对象:
Animal* a = new Cow();
if (Cow* c = dynamic_cast<Cow*>(a)) {
c->nonVirtualFunction();
}
然而,这通常是糟糕的设计标志。
您需要使用Cow指针来调用nonVirtualFunction。动物指针是指向具有动物界面的牛的SUBSET的指针。
调用nonVirtualFunction的唯一方法是获取Cow指针。
Cow *c = dynamic_cast<Cow*>(a);
会给你这样一个指针,假设一个真的指向一个牛。
我会去牛* c =新牛();确实!感谢hlp – 2013-03-19 15:09:03
我会为了使用实名的方法,而不是占位符,以便更好地解释一下:
class Animal{
virtual void move()=0;
}
class Cow : Animal{
virtual void move(){}
void moo(){}
}
int main() {
Animal *a = new Cow();
a->move();
a->moo(); // ERROR
}
嘛,当然这是一个错误的:为什么地球上,你会想使一个普通的Animal
moo
?所以问题不在于如何在任何Animal
上致电moo
;只是这个调用没有意义,编译器可以帮助我们注意到。现在
,一个Animal
可能有一个非虚方法可以在任何动物被称为无需重写它的子类,例如:
class Animal{
// Everything else, plus:
std::string Name() {return name;}
private:
std::string name;
}
int main() {
Animal *a = new Cow();
a->move();
std::string animalName = a->Name(); // OK
}
正如你所看到的,如果你有一个好的设计问题消失。
嗯的确,你的方式与真实姓名,而不是占位符确实更清晰!将这样做:) 但是,谢谢,现在确实有答案,应该只是让一头牛* c =新牛! – 2013-03-19 15:07:40
非常感谢,不知道,我会用Cow * c = new Cow();确实! – 2013-03-19 15:08:45