[英]instantiate an abstract class in c++ like in Java
我在C ++個人學習過程中遇到了困難。 我來自Java語言。
我試圖在C ++中設置一個具有抽象方法的類。 到那里,沒有什么大不了的。 但是我想在Java中實例化那個類:
// MyClass has an abstract method named "AbstractMethod"
MyClass class_object = new MyClass()
{
@Override
public void AbstractMethod()
{
// Do something here
}
};
class_object.AbstractMethod();
在Java中,它完美地運行。 但是我想在C ++中做同樣的事情,這里有一個問題:C ++似乎不喜歡實例化具有虛方法的類的想法。
我已經搜索了幾天,我在互聯網上找不到任何答案。 也許只是我寫錯了搜索句子,因為我不是英語母語人士,在提出問題時我可能會遇到一些困難。
在C ++中,我是否有可能像在Java中一樣,或者至少可能? 使用模板是解決方案嗎? (之前從未學過模板,我還有很多需要學習的東西)。
此外,我無法創建許多類來重新定義方法,因為此類將用於為每個實例執行自定義處理。 我認為,創建課程只是為了讓它成為這種類型中唯一一個對象的驕傲之父。
我會說 - 在c ++中,相當於你的java代碼將是:
#include <iostream>
struct A {
virtual void foo() = 0;
};
int main(void) {
struct B : public A {
void foo() override {
std::cout << "inst::foo()" << std::endl;
}
};
A* p = new B;
p->foo();
}
正如您所看到的那樣,沒有實例化抽象類,您必須提供實例化的具體實現。 微妙的區別是在java中它是一個匿名類,這里不是......
它不是您示例中MyClass
的實例化! 您只需使用anonymous inner-class
擴展它,然后通過此代碼和語法實例化它的實例(類不是那么匿名,但是 - 它的名稱類似於YourClass$1
)。
然后你可以使用MyClass
將這個匿名的YourClass$1
類實例的引用放到變量中,因為它是一個超類(你也可以使用Object
或某些接口類型)
C ++ 11沒有完全相同類型的內部類和擴展/實例化語法,但您可以嘗試使用Lambdas來實現類似的結果。 看這里: C ++ 0x是否支持匿名內部類?
與c ++不同,Java區分接口和抽象類,這可能是您混淆的根源。
這是Java接口在c ++中的外觀:
class myClass{
virtual void foo =0; //pure virtual method
}
這是c ++中的Java抽象類:
class myClass{
virtual void foo=0;
virtual void abstractMethod();
}
這些都不能實例化,您只能從它們繼承並覆蓋抽象方法。
class myClass_Impl: public myClass
{
void foo();//must provide an implementation for pure virtual methods
void abstractMethod(); //override the abstract class method
}
main()
{
myClass_Impl x; //instace of your class
myClass * p = new myClass_Impl(); //using polymorphism
}
語法略有不同。 但是您可以返回本地類的實例:
class MyAbstractClass {
public:
virtual void my_method() = 0;
};
MyAbstractClass* some_function() {
class MyConcreteClass : public MyAbstractClass { // Our local class definition.
public:
virtual void my_method() override {
// some code
}
};
return new MyConcreteClass(); // Return a pointer to an instance of it
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.