2010-05-07 78 views
8
class Base 
{ 
public: 
    virtual void foo() const 
    { 
     std::cout << "Base"; 
    } 
}; 

class Derived : public Base 
{ 
public: 
    virtual void foo() const 
    { 
     std::cout << "Derived"; 
    } 
}; 

Derived d; // call Base::foo on this object 

尝试了铸造和函数指针,但我无法做到。是否有可能打败虚拟机制(只想知道是否有可能)?从派生类型的对象的基类调用虚拟方法

+0

[如何通过指向派生类的基类指针调用基类方法](http://stackoverflow.com/questions/1136249/how-to-call-base-class-method-through-base -class-pointer-pointing-to-derived-cla) – outis 2012-04-22 00:09:19

回答

24

显式调用在Base定义的功能foo(),使用方法:

d.Base::foo(); 
+0

+1对你也是丹尼尔 - 奇怪你是如何回答的,我一开始并没有出现。 – ChrisBD 2010-05-07 10:21:05

+1

@ChrisBD:在发布之后,我突然意识到我不记得曾经直接使用这个构造(只在派生类中的函数定义内部)。因此,我决定删除它一段时间,直到我确信它的工作。 – 2010-05-07 10:25:23

6
d.Base::foo(); 

注意会打电话Derived::foo不管foo是否是虚拟的或没有。

+0

+1 @Marcelo - 你对我来说太快了:) – ChrisBD 2010-05-07 10:20:01

+1

呃......其实一个完全合格的名字明确地击败了* virtual dispath *。你似乎认为'd.foo()'调用不是虚拟的。该语言没有这样说。从语言的角度来说,'d.foo()'调用是* virtual *,即它根据'd'的动态类型来解析。如果你的编译器静态调度它,那么它只不过是由你的编译器完成的优化(因为动态类型在编译时是已知的)。从语言的角度来看,击败虚拟调度的唯一方法是使用完全合格的名称。 – AnT 2010-05-07 10:27:23

+0

好吧,它击败了两者。但是'b-> Base :: foo' *只会打败虚拟派遣。 – 2010-05-07 10:36:49

相关问题