有這樣一個問題:
是不是一個父類寫了一個virtual 函數,如果子類覆蓋它的函數不加virtual ,也能實現多態?
一般的回答是也可以實現多態。究其原因,有人說virtual修飾符是會隱式繼承的。這樣來說,此時virtual修飾符就是可有可無的。
又有人說,當用父類去new這個子類時,不加virtual的函數會 有問題的,應該加上。
我寫了個例子,想去驗證一下不加virtual時會不會有問題:
[cpp]
// TestPolymorphic.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Animal
{
public:
Animal(){cout<<"animal constructor"<<endl;}
virtual ~Animal(){cout<<"animal destructor"<<endl;}
virtual void cry() const{cout<<"animal cry..."<<endl;}
};
class Dog:public Animal
{
public:
Dog(){cout<<"dog constructor"<<endl;}
virtual ~Dog(){cout<<"dog destructor"<<endl;}
void cry() const{cout<<"dog cry..."<<endl;}
};
class Wolfhound:public Dog
{
public:
Wolfhound(){cout<<"Wolfhound constructor"<<endl;}
virtual ~Wolfhound(){cout<<"Wolfhound destructor"<<endl;}
void cry() const{cout<<"Wolfhound cry..."<<endl;}
};
int _tmain(int argc, _TCHAR* argv[])
{
Animal *pAnimal = new Wolfhound();
static_cast<Wolfhound*>(pAnimal)->cry();
delete pAnimal;
getchar();
return 0;
}
結果打印出來的與預期的一樣:
這就說明了不加virtual是沒有問題的。
昨天翻看了一下錢能老師的《C++程序設計教程》,
有過如下一段話:www.2cto.com
一個類中將所有的成員函數都盡可能地設置為虛函數總是有益的。
下面是設置虛函數的注意事項:
1、只有類的成員函數才能聲明為虛函數。
2、靜態成員函數不能使虛函數,因為它不受限於某個對象。
3、內聯函數不能使虛函數。
4、構造函數不能是虛函數。
正如weiqubo這位網友告知的:那些函數都應該加virture吧.
作者:lincyang