程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 關於子類中virtual可有可無的討論

關於子類中virtual可有可無的討論

編輯:C++入門知識

有這樣一個問題:
是不是一個父類寫了一個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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved