我看到一些例子,像基類中的函數被聲明爲純函數(如虛函數),並且在派生類中聲明(如虛函數)並實現。在第二種情況下(我現在正在這樣做),基類不聲明函數,只聲明派生類聲明(不是虛函數)並執行。這兩個選項有什麼區別?在派生類中定義函數而無需在基類中聲明
1
A
回答
0
在第一種情況下(並且順便說一下,派生類中的虛擬聲明是多餘的 - 虛擬化是繼承的),可以使用指針Base* p = new Derived()
來調用p->the function
。
在第二種情況下,您無法使用p
調用該函數。您只能使用Derived* pp = new Derived()
,然後使用pp->the function
。
0
如果基類根本沒有聲明函數,那麼該函數不能通過基類的類型調用。例如:
struct Base1
{
virtual ~Base1() {}
virtual void foo() const = 0;
};
struct Derived1 : Base1
{
virtual void foo() const override { std::cout << "Foo!\n"; }
};
int main()
{
Base1 *p = new Derived1();
p->foo(); // Works fine
delete p;
}
比。
struct Base2
{
virtual ~Base2() {}
};
struct Derived2 : Base2
{
virtual void foo() const { std::cout << "Foo!\n"; }
};
int main()
{
Base2 *p = new Derived2();
p->foo(); // Compiler error: no foo() in Base2
delete p;
}
0
不同的是,在第一種情況下,你有polimorphism而在第二種情況下,你有沒有它。
考慮下面的例子
第一殼體
#include <iostream>
struct B
{
virtual void f() const = 0;
virtual ~B() {}
};
struct D1
{
void f() const { std::cout << "It's me, D1!" << std::endl; }
};
struct D2
{
void f() const { std::cout << "No, it's me, D2!" << std::endl; }
};
void g(const B &b)
{
b.f();
}
int main()
{
D1 d1;
g(d1);
D2 d2;
g(d2);
}
和第二殼體
#include <iostream>
struct B
{
};
struct D1
{
void f() const { std::cout << "It's me, D1!" << std::endl; }
};
struct D2
{
void f() const { std::cout << "No, it's me, D2!" << std::endl; }
};
void g(const B &b)
{
// b.f(); // compilation error
}
void g1(const D1 &d1)
{
d1.f();
}
void g2(const D2 &d2)
{
d2.f();
}
int main()
{
D1 d1;
g1(d1);
g(d1); // function f will not be called
//g2(d1); // compilation error
D2 d2;
g2(d2);
g(d2); // function f will not be called
//g1(d2); // compilation error
}
相關問題
- 1. 在派生類中定義函數
- 2. 使用在基類派生類,而派生類的基類
- 3. 在基類中使用靜態數組的C++,在派生類中聲明
- 4. 在派生類中聲明枚舉
- 5. 在派生類中聲明的非虛擬虛函數
- 6. 在派生類中是否需要顯式聲明析構函數?
- 7. 如何調用未在派生類中定義的基類的函數?
- 8. 在基類funciton中使用此派生類成員函數,其中派生類中的overriden函數
- 9. 使用聲明(派生類)
- 10. 爲什麼不能在派生類中聲明操作符來隱藏在基類中聲明的操作符?
- 11. 定義派生類中基類的未定義方法
- 12. PHP。在基類中使用方法將在派生中定義
- 13. 從調用派生類的基類構造函數在Java中
- 14. 在派生類中重載基類函數
- 15. 在C++中調用的基類和派生類構造函數
- 16. 在派生類中調用基類構造函數
- 17. 在派生類中調用基類構造函數
- 18. 指向派生類對象的基類指針可以訪問在派生類中聲明的新成員嗎?
- 19. 無法在基類中聲明信號
- 20. 從派生類訪問基類函數
- 21. 內聯基類內部聲明但通過派生類調用的函數
- 22. 虛擬函數在基類中是常量而在派生中不是常量
- 23. 在Javascript中定義構造函數派生類
- 24. C++:與CRTP,在派生類定義的類不是基礎類
- 25. 將基類中的_forceinline虛函數在派生類中__forceinlined而不明確指出它?
- 26. 如何聲明從特定類派生的類型參數?
- 27. C++:通過基類中定義的函數指針派生函數調用
- 28. 如何轉發聲明從前向聲明的模板基類派生的類?
- 29. 私人虛函數在派生類中
- 30. 明確投基類派生類