簡體   English   中英

為什么這個方法不像我期望的那樣調用虛擬?

[英]Why isn't this method call virtual like I was expecting?

我想問一下,當我使用沒有指針的虛函數時會發生什么? 例如:

#include <iostream>
using namespace std;
class Parent
{
 public:
   Parent(int i) { }
   virtual void f() { cout<<"Parent"<<endl; }
};

class Child : public Parent
{
 public:
   Child(int i) : Parent(i) { }
   virtual void f() { Parent::f(); cout<<" Child"<<endl; }
};

int main()
{
    Parent a(2);
    Parent b = Child(2);
    a.f();
    b.f();
    return 0;
}

^^為什么不起作用? 我在哪里可以找到有關虛擬方法如何工作的內容?

這種效果稱為“切片”。

Parent b = Child(2); // initializes a new Parent object using part of Child obj

在C ++中,動態類型可能只與引用或指針的靜態類型不同。 你有一個直接的對象。 所以,你的懷疑基本上是正確的。

請嘗試以下方法:

std::auto_ptr<Parent> b = new Child(2);

在您的代碼中,您將Child對象的一部分復制到b 這就是所謂的對象切片

僅當通過適當的引用或適當的指針調用虛函數時,才啟用虛函數機制。 請注意,虛構函數調用機制在構造函數/析構函數中或使用::運算符時被抑制。

如果代碼如下所示,將啟用虛擬功能機制。

Child c;
Parent &a = c;
a.f();

沒有指針,即使是虛函數調用,調用也是靜態綁定的。

編輯2:

$ 10.3 / 6 - [注意:虛函數調用的解釋取決於調用它的對象的類型(動態類型),而非虛擬成員函數調用的解釋僅取決於類型表示該對象的指針或引用(靜態類型)(5.2.2)。 ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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