【问题标题】:Derived class members inaccessible from within a function that takes pointer to base class as parameter?从将指向基类的指针作为参数的函数中无法访问派生类成员?
【发布时间】:2020-08-02 23:39:15
【问题描述】:

我正在实现类型检查并编写了一个函数,该函数接受两个指向基类对象的指针并检查对象是否表示相同的类型。

这是基类定义:

class Type {
public:
    virtual int get_type(void) { return 1; };
    string name;
    Type(){};
    Type(string n)
    {
        name = n;
    }
};

目前,我有一个派生类,如下所示:

class Array : public Type {
public:
    Type *type;
    int depth;
    virtual int get_type(void) { return 3; };
    Array(Type *t, int d) : Type("array"){
        type = t;
        depth = d;
    }
};

我写的函数如下:

bool check_type(Type *t1, Type *t2)
{
    int a1 = t1->get_type(), a2 = t2->get_type();
    if (a1 != a2)
        return false;
    if(a1 == 1 )
    {
        if(t1->name == t2->name)
            return true;
        return false;
    }
    else if(a1 == 3)
    {
        if(t1->depth == t2->depth && check_type(t1->type, t2->type))
            return true;
        return false;
    }
}

如您所见,该函数检查两个对象是否相同。

从函数中访问派生类成员 depthtype 时,出现以下错误:

./src/parser.y:722:29: error: ‘class Type’ has no member named ‘depth’
         if(t1->depth == t2->depth && check_type(t1->type, t2->type))
                             ^
./src/parser.y:722:53: error: ‘class Type’ has no member named ‘type’
         if(t1->depth == t2->depth && check_type(t1->type, t2->type))
                                                     ^

我是 C++ 类的新手。 为什么我会收到此错误,我还能如何实现我在这里尝试做的事情?

编辑: 我将部分代码更改为

Array *ar1 = dynamic_cast<Array*>(t1);
Array *ar2 = dynamic_cast<Array*>(t2);
if(ar1->depth == ar2->depth && check_type(ar1->type, ar2->type))
     return true;

问题已解决。

【问题讨论】:

  • 您应该将类​​型 *t1 更改为数组 *a1。实际上,类型类没有名为 depth 的成员。拥有这些成员的是 Array 类。
  • t1t2 是指向 Type 的指针,而不是指向 Array 的指针。如果您需要访问Array 成员并且知道t1t2 确实是指向Array 对象的指针,则需要将(static_castdynamic_cast)指针转换为正确的类型。
  • 有些程序员老兄在这里有更好的观点,这就是我的意思
  • @Adrisui3 目前,我只编写了从 Type 派生的几个类之一。所以,我最终不得不在这个函数中处理几个可能的 Type 子类。从 Type *t1 更改为 Array *t2 意味着为每种可能的“类型”类型创建一个单独的函数。但是,我希望这样,每当我有两种类型时,我都可以使用 check_type(t1, t2) 来检查它们是否相同,其中 t1 和 t2 是引用。
  • @Someprogrammerdude 是的,解决了它。

标签: c++ class oop compiler-construction derived-class


【解决方案1】:

这是因为,在编译器看来,t1 和 t2 都是指向“Type”的指针,而“Type”类没有任何名为“depth”和“type”的成员。编译器不知道原始类是“Array”。我知道根据您的逻辑,如果(a1 == 3)那么类的类型是“数组”。但是编译器不知道这一点。

现在的问题是如何解决它。我不确定你实际上想用这些类实现什么。但是以目前对您问题的了解,我只能给您以下解决方案。

在到达这条语句(有编译错误)时,由于我们确定 t1 和 t2 的类型是“Array”,我们实际上可以将它们动态转换为 Array* 类型,然后访问成员变量 type 和深度。

Array* arrT1 = dynamic_cast<Array*> (t1);
Array* arrT2 = dynamic_cast<Array*> (t2);

现在您可以访问深度和类型为 arrT1->depth 和 arrT1->type(或 arrT2->depth, arrT2->type),如下所示

if(arrT1->depth == arrT2->depth && check_type(arrT1->type, arrT2->type))
        return true;

【讨论】:

  • 是的。我就是这么做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 2011-01-27
  • 2017-07-18
  • 2023-04-07
  • 2017-12-27
相关资源
最近更新 更多