![](/img/trans.png)
[英]Is it safe to call a non-virtual base class member function from the base class destructor using a derived class pointer?
[英]How can I call derived class non virtual member function using base class pointer without typecasting and using polymorphism?
有什么辦法可以使ptr-> fun2()成為可能?
class A
{
void fun1()
{
A* ptr;
ptr->fun2();
}
}
class B : class A
{
void fun2()
{
}
}
這是不可能的。 C ++是一種靜態類型的語言。 ptr
的類型是指向A
指針。 fun2
不是A
的成員。 根據定義,不可能通過指向類型A
的指針/引用來調用fun2
。
這通常通過鑄造解決。 由於您出於未指明的原因取消了該資格,因此無法執行您想要的操作。
不會A
沒有成員函數fun2
,因此您ptr->fun2()
A*
類型的指針調用ptr->fun2()
。
如果指針碰巧指向具有此類成員函數的派生對象,則可以static_cast
指針指向具有成員函數的類型。 如果您不知道,則可以嘗試進行dynamic_cast
(但僅當類型為多態時),但這通常是一個不好的設計(但有時還可以),而不是您想要執行的操作。
我只想知道我的問題是否有解決方案
如果要使用指向A
的指針來調用fun2
,則解決方案是將成員函數fun2
添加到類A
。 如果希望將對ptr->fun2
的調用分派到B::fun2
,則需要使該函數虛擬化-但由於某些原因,您明確不想使用針對該問題設計的工具。
我不想將fun2()虛擬化,因為許多派生基類中只有一個將實現它。
但這並不能阻止您在A
中使用虛函數,但是對於接口而言,僅具有一個派生類使用的虛函數可能是不好的。
我建議不要首先使用A*
指針,而要使用B*
。 然后,您無需進行強制轉換,也無需調用虛擬函數。
t進行類型檢查,檢查ptr是否指向類型B的對象,然后在fun1()中創建“ ptr-> fun2()”
投射可能不是那么糟糕的選擇。 但是我還有另一個建議:將fun1
分成兩個版本。 一種針對類型B
調用,其中調用fun2
,另一種針對其他類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.