簡體   English   中英

像在Java中一樣用c ++實例化一個抽象類

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

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