在 C++ 中将派生 class 对象分配和访问到基 class "pointer to pointer" 对象
Assigning and Accesing derived class object to base class "pointer to pointer" object in C++
我对 C++ 非常陌生。我遇到这样的情况:我有一个基数 class,它包含两个虚函数(不是纯函数)。我为此 class 派生了 class,我在其中实现了这些虚函数。现在在我的 main() 函数中,我创建了一个指向指向基 class 的指针对象的指针。现在使用这个对象如何访问派生的 class 对象和函数。
我只希望指向基 class 的指针对象的指针应用于访问派生 class 对象。
基地 CLASS:
class another
{
public:
virtual void setName(){};
virtual string getName(){};
};
派生Class
class use: public another
{
public:
string str;
void setName()
{
str = "USE CLASS";
}
string getName()
{
return str;
}
};
我的 main() 函数:
int main()
{
another **an;
*an = new use();
an->setName(); //getting error
cout<<an->getName()<<endl; //getting error
return 0;
}
an
是指向 another
的指针。 *an
returns 指向 another
的指针。所以你想要 (*an)->setName();
像这样:
int main()
{
another **an;
*an = new use();
(*an)->setName(); //getting error
cout<<(*an)->getName()<<endl; //getting error
return 0;
}
*an = new use();
指针 an
未初始化,无法解除引用。使用双指针(指向指针的指针)在这里没有实际意义。在这种情况下,tit 所做的只是为代码添加另一个级别的引用。取消引用此类指针的表达式导致指向 class 'another' 的指针的值存储...在哪里?您从未创建过该存储,因此此类操作是一个 UB。
代码的合法变体:
int main()
{
another **an = new another*(); // creating storage for pointer
*an = new use();
(*an)->setName();
cout<<(*an)->getName()<<endl;
delete *an; // don't rely on OS to do so.
delete an;
return 0;
}
int main()
{
another **an = new another*(new use()); // doing this in one line
// storage of *an would be value-initialized by value returned
// from 'new use()' instead of default initialization
(*an)->setName();
cout<<(*an)->getName()<<endl;
delete *an; // don't rely on OS to do so.
delete an;
return 0;
}
int main()
{
another *an = new use();
// We don't need another pointer~ use an reference where required?
an->setName();
cout<<an->getName()<<endl;
delete an; // don't rely on OS to do so.
return 0;
}
PS。这个 class another
的声明在技术上是错误的,我可以假设你已经跳过了 getName 的主体。它应该会导致有关函数缺少 return 值的编译时错误。如果 another
本身不可用 class,您可以将方法声明为 pure
class another
{
public:
virtual void setName() = 0;
virtual string getName() = 0;
};
无法创建此类 class 或未覆盖这些方法的派生 class 的实例,但它提供了您正在研究的 "boilerplate" 机制。
我对 C++ 非常陌生。我遇到这样的情况:我有一个基数 class,它包含两个虚函数(不是纯函数)。我为此 class 派生了 class,我在其中实现了这些虚函数。现在在我的 main() 函数中,我创建了一个指向指向基 class 的指针对象的指针。现在使用这个对象如何访问派生的 class 对象和函数。
我只希望指向基 class 的指针对象的指针应用于访问派生 class 对象。
基地 CLASS:
class another
{
public:
virtual void setName(){};
virtual string getName(){};
};
派生Class
class use: public another
{
public:
string str;
void setName()
{
str = "USE CLASS";
}
string getName()
{
return str;
}
};
我的 main() 函数:
int main()
{
another **an;
*an = new use();
an->setName(); //getting error
cout<<an->getName()<<endl; //getting error
return 0;
}
an
是指向 another
的指针。 *an
returns 指向 another
的指针。所以你想要 (*an)->setName();
像这样:
int main()
{
another **an;
*an = new use();
(*an)->setName(); //getting error
cout<<(*an)->getName()<<endl; //getting error
return 0;
}
*an = new use();
指针 an
未初始化,无法解除引用。使用双指针(指向指针的指针)在这里没有实际意义。在这种情况下,tit 所做的只是为代码添加另一个级别的引用。取消引用此类指针的表达式导致指向 class 'another' 的指针的值存储...在哪里?您从未创建过该存储,因此此类操作是一个 UB。
代码的合法变体:
int main()
{
another **an = new another*(); // creating storage for pointer
*an = new use();
(*an)->setName();
cout<<(*an)->getName()<<endl;
delete *an; // don't rely on OS to do so.
delete an;
return 0;
}
int main()
{
another **an = new another*(new use()); // doing this in one line
// storage of *an would be value-initialized by value returned
// from 'new use()' instead of default initialization
(*an)->setName();
cout<<(*an)->getName()<<endl;
delete *an; // don't rely on OS to do so.
delete an;
return 0;
}
int main()
{
another *an = new use();
// We don't need another pointer~ use an reference where required?
an->setName();
cout<<an->getName()<<endl;
delete an; // don't rely on OS to do so.
return 0;
}
PS。这个 class another
的声明在技术上是错误的,我可以假设你已经跳过了 getName 的主体。它应该会导致有关函数缺少 return 值的编译时错误。如果 another
本身不可用 class,您可以将方法声明为 pure
class another
{
public:
virtual void setName() = 0;
virtual string getName() = 0;
};
无法创建此类 class 或未覆盖这些方法的派生 class 的实例,但它提供了您正在研究的 "boilerplate" 机制。