2010-12-19 77 views
1

当一个基类中具有相同的函数名,并且每个函数的代码都不相同时,是否需要将我的函数设置为虚拟,还是仅仅是更好的编程的一部分?虚拟成员函数的必要性

+0

你的函数是否也有相同的签名? – EnabrenTane 2010-12-19 19:59:50

+0

也许吧。它可能不应该是虚拟的。无法从您的问题中获知。 Google'多态性'。 – 2010-12-19 20:03:52

回答

3

根本没有必要使方法变为虚拟。但是,如果您希望通过“后期绑定”来调用它,那么它应该是虚拟的,即,如果给定基本指针,您希望调用派生方法。

如果您不希望发生这种情况,通常是因为这些方法不相关,在这种情况下,您最好为派生类中的方法指定一个不同的名称。

0

虚拟函数的调用在运行时动态调度。这是多态性的基础。

在基类中声明为虚拟的函数在子类中将隐式地为虚拟。

0

不,没有必要这样做。

事实上,何时申报虚拟和何时不是有效的程序设计本身的一部分。

查看here了解关于虚拟和纯虚拟功能的更多信息。

0

如果您希望使用派生类实例的基类指针,并且函数具有相同的签名,那么您可能需要使函数virtual以及使类的析构函数为virtual。这样,如果某人有父类指向派生类型的指针,并且他们想要调用该函数,那么他们可能会想要执行子类的版本(如果它不同于父类的)。

class Parent 
{ 
public: 
    virtual ~Parent() {} 

    virtual void doSomething() 
    { 
     std::cout << "Parent"; 
    } 
}; 

class Child : public Parent 
{ 
public: 
    virtual ~Child() {} 

    virtual void doSomething() 
    { 
     std::cout << "Child"; 
    } 
}; 

int main() 
{ 
    Parent *p = new Child(); 
    p->doSomething(); // prints "Child" because of dynamic dispatch 
} 
0
class A { 
public: 
    void Foo() {} 
    virtual void Bar() {} 
}; 
class B : public A { 
public: 
    void Foo() {} 
    virtual void Bar() {} 
}; 

int main() { 
    A *a = new A; 
    B *b = new B; 
    A *c = b; 

    a->Foo(); // calls A::Foo on a 
    b->Foo(); // calls B::Foo on b 
    c->Foo(); // calls A::Foo on b 

    a->Bar(); // calls A::Foo on a 
    b->bar(); // calls B::Foo on b 
    c->bar(); // calls B::Foo on b 

    delete a; 
    delete b; 
} 

请参阅C++ FAQ § Inheritance — virtual functions