C++ 虚函数基返回类型建议

标签 c++ oop polymorphism virtual return-type

我需要一个基类来为我提供数据指针的原始类型。我在里面添加了一个函数。我派生了类的类型。我使用 void * 支持所有原始类型作为返回类型,但这就像旧的 C 时代一样。这对于 OOP 来说并不好。有人建议以正确的方式在 OOP 中进行操作吗?

#include <iostream>

class base {
public:
    virtual void *getPtr() = 0;
    virtual ~base() {};
};

class derivedAType : public base {
protected:
    int _i;
public:
    derivedAType(int i): _i(0) { _i = i; };
    virtual ~derivedAType() {}

    virtual void *getPtr() {
        return static_cast<void *>(&_i);
    }
};

class derivedBType : public base {
protected:
    short _s;
public:
    derivedBType(short s): _s(0) { _s = s; };
    virtual ~derivedBType() {}

    virtual void *getPtr() {
        return static_cast<void *>(&_s);
    }
};

int main()
{
    base *b1 = new derivedAType(1203912);
    base *b2 = new derivedBType(25273);

    std::cout   << "b1 : "   << *(static_cast<int *>(b1->getPtr()))
                << "\nb2 : " << *(static_cast<short *>(b2->getPtr()))
                << std::endl;

    delete b2;
    delete b1;

    return 0;
}

最佳答案

使基类成为模板类,数据类型为模板变量

template<typename DataType>  
class base {
virtual DataType* getPtr() = 0;
//...
};

class derivedAType : public base<int>

但这会将基类更改为模板类,这意味着您无法将它们存储在一起,base<int>base<short> 不同

如果这是 Not Acceptable ,其他选项只是比您的代码干净一点,但大致相同,请参阅 this question 。基本上派生类返回类型可以反射(reflect)它们的真实类型,我认为它应该自动转换为 void* ,因此您不必手动转换指针。

关于C++ 虚函数基返回类型建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13286171/

相关文章:

c++ - 用下划线替换空格

c++获取错误 "Run-Time check failure #2 - stack around variable sub was corrupted"

c++ - CLion CMake ld:找不到库+ Vulkan和OpenGL问题

language-agnostic - 抽象基类何时可以拥有(非静态)数据成员?

oop - Kotlin - 是否可以在类中的 init block 之前初始化伴随对象?

c++ - 是否有可能在 C++03 中实现类似 'override' 的功能

C++ 使用 32 位和 64 位库编译应用程序

javascript - 如何从子方法中调用父方法?

c++ - 为什么 boost::scoped_ptr 在继承场景中不起作用?

c# - 我什么时候真正需要使用抽象方法?