c++ - 如何创建多态对象

标签 c++ class oop polymorphism

我有一个类,它结合了一些结构,例如像这样:

struct _tRack1{
    unsigned char shelf1;
    unsigned int shelf2;
    float shelf3;
};

struct _tRack2{
    char shelf1;
    int shelf2;
    char shelf3;
    char shelf4;
};

struct _tRack3{
    char shelf1;
    unsigned int drawer[5];
};
class Catalog
{
public:
    _tRack1 *localdata1;
    _tRack2 *localdata2;
    _tRack3 *localdata3;
    int index;
    Catalog(int recktype){
        localdata1 = NULL;
        localdata2 = NULL;
        localdata3 = NULL;
        index = recktype;
        switch(recktype){
            case 1: *localdata1 = new _tRack1; break;
            case 2: *localdata2 = new _tRack2; break;
            case 3: *localdata3 = new _tRack3; break;
        }
    };
    ~Catalog(){
        if(localdata1 != NULL) delete localdata1;
        if(localdata2 != NULL) delete localdata2;
        if(localdata3 != NULL) delete localdata3;
    };
    int someMethod(_tRack1){/*...*/};
    int someMethod(_tRack2){/*...*/};
    int someMethod(_tRack3){/*...*/};
};

int main()
{
    Catalog *foo = new Catalog(1);
    Catalog *bar = new Catalog(3);

    /*...*/
    if(foo->index>1) foo->localdata1->shelf1=-3;
       else foo->localdata1->shelf1=3;
    if(bar->index>1) bar->localdata1->shelf1=-3;
       else bar->localdata1->shelf1=3;
    if(bar->index==3) bar->localdata3->drawer[0] = 0xDEADBEAF;


    /*...*/
    delete foo;
    delete bar;
    return 0;
}

我知道将结构公开是不好的,但在现实生活中结构非常复杂,因此不可能创建访问结构的单独字段的方法。 我想找到一种隐藏结构类型的方法。要像这样访问数据:

    if(foo->index>1) foo->data->shelf1=-3;
       else foo->data->shelf1=3;
    if(bar->index>1) bar->data->shelf1=-3;
       else bar->data->shelf1=3;
    if(bar->index==3) bar->data->drawer[0] = 0xDEADBEAF;

这可能吗?

最佳答案

你应该扔掉你到目前为止所做的任何事情。然后阅读一本关于面向对象编程的书,而不是从头开始。

简单来说,您应该创建一个基类 Rack,然后从中继承特定的 Rack 类型(即派生类)。 Catalog 或任何其他类都不应知道从 Rack 派生的对象的详细信息。它应该要求 Rack 派生对象通过调用它们的虚拟方法来执行操作,而不是请求/访问它们的私有(private)详细信息。

此外 - 现在忘记 new 和 delete 的存在。你还不需要它。它会使您的代码变得更糟。

关于c++ - 如何创建多态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25307170/

相关文章:

c++ - 是什么导致了我的代码中的堆损坏和无关值?

c++ - 将 Cpp 代码片段转换为 VB.NET

python - 如何从类体内调用静态方法?

unit-testing - 不可测试代码的警告标志

c++ - 在 ';' 之前缺少 '*'

c++模板使用来自基类的声明

python - 创建动态对象python

java - 使用 Java 将内部类设为静态有什么好处?

java - 当类型的实现不再有效时该怎么办?

php - URL Router 和 Dispatcher 有什么区别?