C++用抽象类作为参数覆盖虚方法

詹姆斯·帕克

我有以下抽象类

class A {
public:
    virtual void foo(A* a) = 0;
}

以及从这个类继承的几个类。例如

class B : public A {
public:
    void foo(A* a); // implementation in a separete file
}

但是,我只希望 classB接受自己作为参数foo

void foo(B* b);

是否可以在 C++ 中做到这一点?我考虑过一个模板,但语法允许太多的灵活性。可以写class B: public A<B>,但我想要一个编译器错误class B: public A<C>

- 编辑 -

似乎我对抽象类的使用是不合理的。让我澄清一下我的情况。

A在一个单独的函数中使用了多态行为除此之外,我想定义一个函数,它接受一个相同类型的参数,比如上面的那个。我正在尝试编写一个函数来定义派生类的两个对象之间的距离。距离仅在来自同一类的对象之间定义(b1and b2, or c1and c2,但不是b1and c2)。我也想以尽可能通用的方式访问这个距离函数。

-- 编辑 2--

Cássio 展示了为什么不能执行基于编译器的检查。zar 的解决方案通过运行时错误检查为代码添加了更多结构。

扎尔

我知道您的问题更多是关于语法的。你所拥有的是对的,只需传递一个类型 B 的对象。定义仍然会说 A,但它会很乐意接受派生类。您不需要对此有任何特殊定义。

class A {
public:
    virtual void foo(A* a) = 0;
};

class B : public A {
public:
    void foo(A* a)
    {
        if (dynamic_cast<B*> (a) == NULL)
            std::cout << "wrong type, expecting type B\r\n";
    }
};

class C : public A {
public:
    void foo(A* a)
    {
        if (dynamic_cast<C*> (a) == NULL)
            std::cout << "wrong type, expecting type C\r\n";
    }
};

int main()
{
    B * b1 = new B;
    B * b2 = new B;

    C * c1 = new C;
    C * c2 = new C;

    b2->foo(c1); // bad

    c1->foo(b1); // bad

    b2->foo(b1); // good

    delete b1;
    delete b2;
    delete c1;
    delete c2;
}

另见dynamic_cast

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C ++中使用抽象类作为函数的参数

来自分类Dev

在C ++中使用抽象类作为函数的参数

来自分类Dev

C ++在实现的纯虚方法中自动从父抽象类调用检查方法吗?

来自分类Dev

抽象类C ++

来自分类Dev

C ++:抽象类

来自分类Dev

抽象类C#

来自分类Dev

界面与抽象类C ++

来自分类Dev

抽象类作为类型,派生类作为实例在C ++中

来自分类Dev

特定基类的抽象类的C ++ Vector,作为另一个类成员

来自分类Dev

我们可以用C#中的带有默认方法的接口替换抽象类吗

来自分类Dev

以接口为参数的Java覆盖抽象类方法

来自分类Dev

用Jest中的测试覆盖抽象类方法

来自分类Dev

C#:调用通过另一个抽象类实现的抽象类方法

来自分类Dev

有什么方法可以实现抽象类,它是从 C++ 中的其他抽象类多重继承的?

来自分类Dev

接收从抽象类派生的对象作为方法中的参数

来自分类Dev

c ++-对从抽象类继承的继承的抽象方法进行解密是否存在任何性能问题?

来自分类Dev

具有返回不同类型子项的抽象类中的C#抽象方法

来自分类Dev

如何在Swift类中重写Objective-C类的抽象类级别方法?

来自分类Dev

C ++中抽象类的函数定义

来自分类Dev

C ++抽象类析构函数

来自分类Dev

抽象类中的c ++克隆函数

来自分类Dev

抽象类字段冗余C#

来自分类Dev

抽象类单例C#

来自分类Dev

C ++中抽象类(接口)的数组

来自分类Dev

抽象类的函数定义中的C ++

来自分类Dev

抽象类事件C#

来自分类Dev

抽象类字段冗余C#

来自分类Dev

C ++无法实例化抽象类

来自分类Dev

C ++比较抽象类的后代