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(); 
} 

然而,这通常是糟糕的设计标志。

+0

非常感谢,不知道,我会用Cow * c = new Cow();确实! – 2013-03-19 15:08:45

您需要使用Cow指针来调用nonVirtualFunction。动物指针是指向具有动物界面的牛的SUBSET的指针。

调用nonVirtualFunction的唯一方法是获取Cow指针。

Cow *c = dynamic_cast<Cow*>(a); 

会给你这样一个指针,假设一个真的指向一个牛。

+0

我会去牛* 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 
} 

嘛,当然这是一个错误的:为什么地球上,你会想使一个普通的Animalmoo?所以问题不在于如何在任何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 
} 

正如你所看到的,如果你有一个好的设计问题消失。

+1

嗯的确,你的方式与真实姓名,而不是占位符确实更清晰!将这样做:) 但是,谢谢,现在确实有答案,应该只是让一头牛* c =新牛! – 2013-03-19 15:07:40