【问题标题】:How can I create an abstract base class in C++?如何在 C++ 中创建抽象基类?
【发布时间】:2012-05-11 02:23:46
【问题描述】:

我将如何在 C++ 中执行以下操作(以下代码为 C#):

class Base
{
    public virtual void Foo()
    {
        // do stuff...
    }
}

class C : Base
{
    public override void Foo()
    {
        base.Foo(); // <=== how do you do this line?
    }
}

【问题讨论】:

  • Stack Overflow is not a code translation service。用简单的英语解释需求,而不是用另一种编程语言的代码。
  • 此代码无法在 C# 中编译“无法调用抽象基成员”。
  • Richard - 到目前为止发布你的 C++ 代码以避免样板“拍在手腕上”
  • Foo 在 Base 中可能不是抽象的,否则你将无法调用它...
  • 您无法在 C# 中为抽象方法提供实现,如果您删除该实现,您将在此处看到确切的错误示例:msdn.microsoft.com/en-us/library/aa664435%28v=vs.71%29.aspx。也许您在基类的方法中不是指abstract,而是virtual

标签: c# c++ polymorphism virtual abstract


【解决方案1】:

我只想指出,你可以在 C++ 中做到这一点。您只需在 C++ 中实现纯虚函数即可在 .h 中执行此操作:

class Base
{
    public:
       Base();
       virtual ~Base();
       virtual void Foo()=0;
};

这在你的 .cpp 中

void Base::Foo()
{
   std::cout<< "In Base::Foo which is pure virtual\n";
}

然后在您的派生类中执行其他人指示的操作,在您的 Derived::Foo() 中,您可以调用 Base::Foo() 来生成输出。使函数成为纯虚拟函数并不能消除其具有可执行代码的能力。

【讨论】:

    【解决方案2】:

    使用运算符:::

    class Base
    {
    public:
        virtual ~Base() {}
        virtual void Foo()
        {
            // do stuff
        }
    };
    
    class C : public Base
    {
    public:
        void Foo()
        {
            Base::Foo();
        }
    };
    

    要在 C++ 中拥有一个抽象类,至少有一个方法需要是纯虚拟的:

    class Base
    {
    public:
        virtual ~Base() {}
        virtual void Foo() {}
        virtual void another_function() = 0; // Pure virtual function.
    };
    

    【讨论】:

    • Base::Foo 应该是抽象的,所以 OP 不能在那里“做事”。使其成为纯虚函数。当然,这样做的后果是 Base::Foo() 不再有意义。
    • @Branko 纯虚函数也可以有实现。
    • 完美,:: 运算符正是我想要的!谢谢!
    • @rhughes 只是这并不能满足您的要求,这在 C++ 中没有意义。
    • @juanchopanza 如果您查看我的原始代码(由其他人预先更改),它会完美地回答问题:)
    【解决方案3】:

    像这样:

    class base {
    public:
        virtual void Foo() = 0;
    }
    
    class sub : public base {
    public:
        void Foo() { 
            std::cout << "In Sub!" << std::endl;
        }
    }
    

    注意virtual 关键字的使用。在 C++ 中,除非显式声明,否则不会在运行时查找函数实现,如 C#、Objective-C 或 Java。因此,我们必须告诉运行时

    '嘿,我们这里有一个函数,需要在运行时确定它的实现,所以不要假设它属于 base 类,而是子类。'

    还要注意函数声明的= 0 部分。在 C++ 中,这描述了一个 pure virtual 函数。没有它,base 就不能是抽象的,除非在类中有另一个函数被称为pure virtual

    【讨论】:

    • 我对 q 的评论是针对 OP 的。很抱歉造成混乱
    • 在 C# 中,虚拟性非常明确,就像在 C++ 中一样,但与 Java 不同。
    • @Fanael 与 C++ 不同。我可以在 C# 中重写一个方法,将子类强制转换为基类,当我在基类上调用该方法时,它会调用子类实现。这在 C++ 中是不可能的
    • @RichardJ.RossIII:我可以在 C++ 中重写一个方法,将子类转换为对基类的引用,当我在基类上调用该方法时,它会调用子类实现。实际上,我的观点是,在 C# 中,除非明确标记,否则方法不是虚拟的 - 就像在 C++ 中一样。
    【解决方案4】:

    要在 C++ 中创建一个类抽象,您需要为它提供一个纯虚函数。您的代码的 C++ 版本将是:

    class Base
    {
    public:
        virtual void Foo() = 0; //setting a virtual function to 0 makes it pure virtual.     This is abstract.
    }
    
    class C : Base
    {
    public:
        void Foo()
        {
            Base::Foo(); //I don't think this line will work...You're calling an abstract method.
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 1970-01-01
      • 2016-06-27
      • 2017-05-04
      • 1970-01-01
      • 2013-08-30
      • 2010-11-05
      • 1970-01-01
      相关资源
      最近更新 更多