簡體   English   中英

如何在不進行類型轉換和使用多態的情況下使用基類指針來調用派生類非虛擬成員函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM