2010-08-05 25 views
3
class PureVirtual 
{ 
public: virtual PureVirtual& Foo() = 0; 
     virtual ~PureVirtual() {} 
}; 

class SemiVirtual : public PureVirtual 
{ 
public: PureVirtual& Foo() { printf ("foo worked."); return *this; } 
     virtual ~SemiVirtual() {} 
}; 

class NonVirtual : public SemiVirtual 
{ 
public: NonVirtual& Bar() { printf ("bar worked."); return *this; } 
}; 

TEST (Virtualism, Tests) 
{ 
    PureVirtual& pv = NonVirtual().Bar().Foo(); <-- Works 
    pv.Foo(); // <- Crashes 
} 

pv.Foo由於已經配置了pv實例而崩潰。我怎樣才能防止這種情況,並調用foo函數而不使用指針,而是通過引用?上傳實例並在C++中調用基類上的函數

回答

1

因爲您已經參照臨時對象初始化了pv。 「臨時對象」將在下一行中自動銷燬,此後所有對使用類成員的非靜態方法的調用以及所有虛擬方法都會使應用程序崩潰。

使用指針。或者這個:

TEST (Virtualism, Tests) 
{ 
    NonVirtual v; 
    PureVirtual& pv = v.Bar().Foo(); <-- Works 
    pv.Foo(); 
} 
+1

文章您可以臨時綁定到const引用以延長其使用壽命。 – 2010-08-05 18:51:57

+0

我不明白你打算告訴通過使用const引用。像這樣='PureVirtual&const Foo(){}'。 – 2010-08-05 19:23:29

相關問題