我想創建一個具有純虛函數的抽象類,該純虛函數由非純虛擬的構造函數調用。下面是我的文件class.hpp
:在非純虛函數中使用純虛函數的C++抽象類
#ifndef __CLASS_HPP__
#define __CLASS_HPP__
#include <iostream>
class Parent {
public:
Parent(){
helloWorld(); // forced to say hello when constructor called
};
virtual void helloWorld() = 0; // no standard hello...
};
class Child : public Parent {
public:
void helloWorld(){ // childs implementation of helloWorld
std::cout << "Hello, World!\n";
};
};
#endif
在這個例子中,我有了一個純虛函數helloWorld()
一個父類。我希望每個派生類在構造函數被調用時都會說「hello」;因此helloWorld()
爲什麼在父類構造函數中。但是,我希望每個派生類都是FORCED,以選擇它如何去說「你好」,而不是使用默認方法。這可能嗎?如果我嘗試用g ++編譯這個,我得到了構造函數正在調用純虛函數的錯誤。我main.cpp
是:
#include "class.hpp"
int main(){
Child c;
return 0;
}
我使用g++ main.cpp -o main.out
編譯和所產生的誤差是:
In file included from main.cpp:1:0:
class.hpp: In constructor ‘Parent::Parent()’:
class.hpp:9:16: warning: pure virtual ‘virtual void Parent::helloWorld()’ called from constructor [enabled by default]
對於如何在合法的方式獲得了類似的設置有什麼建議?
新問題
DYP帶來了我的注意,一個構造函數不使用任何重寫功能,所以我希望能夠做的是不可能在我把它設置的方式。但是,我仍然想強制任何派生的構造函數調用函數helloWorld()
,有沒有辦法做到這一點?
呼叫從一個構造函數虛函數(同一個對象的)的構造函數是危險的,因爲它不」 t調用派生類的重寫。在這種情況下,它嘗試調用純粹的「Parent :: helloWorld」,因此*警告*(純虛函數仍然可以實現)。您可以通過參數將派生類中的字符串傳遞給基類ctor,然後在基類中執行輸出。也有可能:2階段初始化。 – dyp
基類依賴於這樣的派生類似乎很奇怪。你能詳細說明你想解決的問題嗎?根據具體情況,可能有其他選項可用。 –
在我的實際問題中,我有一個保存模擬數據的類。但是,在仿真中有很多功能取決於用戶的偏好。我的基類是一個抽象類,它具有讀入大量數據並存儲它的構造函數,但留下了一些抽象函數(這些函數取決於uesr首選項)。所以我希望任何用戶都被迫以相同的方式讀取數據,但也被迫實現這些抽象函數。 – nick