Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何调用未重写的派生类函数? 类基{ 虚空func1(); } 派生类:基{ void func1(); void func2(); } 向量向量机; vec.push_back(新基()),vec.push_back(新派生());_C++_Oop - Fatal编程技术网

C++ 如何调用未重写的派生类函数? 类基{ 虚空func1(); } 派生类:基{ void func1(); void func2(); } 向量向量机; vec.push_back(新基()),vec.push_back(新派生());

C++ 如何调用未重写的派生类函数? 类基{ 虚空func1(); } 派生类:基{ void func1(); void func2(); } 向量向量机; vec.push_back(新基()),vec.push_back(新派生());,c++,oop,C++,Oop,在不知道哪个索引对应于哪个类的情况下,调用func2的正确/干净方法是什么?做这样的事有惯例吗?我还想避免在您的情况下使用typeid,如king_nak的回答中所述,对象是切片的,因此没有安全的方法调用func2() 但是您可以存储指向基对象的指针,而不是基对象-在这种情况下,您可以使用动态\u cast: class Base { virtual void func1(); } class Derived : Base { void func1(); void func2(); } ve

在不知道哪个索引对应于哪个类的情况下,调用func2的正确/干净方法是什么?做这样的事有惯例吗?我还想避免在您的情况下使用typeid

,如king_nak的回答中所述,对象是切片的,因此没有安全的方法调用
func2()

但是您可以存储指向基对象的指针,而不是基对象-在这种情况下,您可以使用
动态\u cast

class Base {
virtual void func1();
}

class Derived : Base {
void func1();
void func2();
}

vector<Base *> vec;
vec.push_back(new Base()), vec.push_back(new Derived());
std::向量向量向量机;
向量推回(新基());
vec.push_back(新派生的());
用于(自动对象:vec)
{
导出*d=动态投影(obj);
如果(d)
{
d->func2();
}
}
有关动态播放的一些信息:


PS:另外,如果你想在
Base
对象上调用函数
func2()
,我认为在
Base
类中添加一个愚蠢的实现是有意义的,在你的例子中,对象是切片的,正如king_nak的回答中提到的,因此没有安全的方法调用
func2()

但是您可以存储指向基对象的指针,而不是基对象-在这种情况下,您可以使用
动态\u cast

class Base {
virtual void func1();
}

class Derived : Base {
void func1();
void func2();
}

vector<Base *> vec;
vec.push_back(new Base()), vec.push_back(new Derived());
std::向量向量向量机;
向量推回(新基());
vec.push_back(新派生的());
用于(自动对象:vec)
{
导出*d=动态投影(obj);
如果(d)
{
d->func2();
}
}
有关动态播放的一些信息:


PS:另外,如果您想在
Base
对象上调用函数
func2()
,我认为在
Base
类中添加一个愚蠢的实现是有意义的,并使函数
virtual

如果可能,此函数将使用上述指针之一调用func2,否则只返回false

std::vector<Base*> vec;
vec.push_back(new Base());
vec.push_back(new Derived());

for (auto obj : vec)
{
    Derived* d = dynamic_cast<Derived*>(obj);
    if (d)
    {
        d->func2();
    }
}
bool CallFunc2(基本*Bae){
导出*Der;
if(Der=动态(Bae))
{Der->func2();返回true;}
其他的
返回false;
}

其工作原理是,如果正在转换的对象无法转换,dynamic_cast将返回一个空指针。

此函数将获取所述指针之一,并在可能的情况下调用func2,否则只返回false

std::vector<Base*> vec;
vec.push_back(new Base());
vec.push_back(new Derived());

for (auto obj : vec)
{
    Derived* d = dynamic_cast<Derived*>(obj);
    if (d)
    {
        d->func2();
    }
}
bool CallFunc2(基本*Bae){
导出*Der;
if(Der=动态(Bae))
{Der->func2();返回true;}
其他的
返回false;
}

这是基于这样一个原理,即如果正在转换的对象无法转换,则dynamic\u cast将返回空指针。

如果您根本不想使用RTTI(包括
dynamic\u cast
),则可以模拟其行为,就像Qt使用它一样

大纲:

bool CallFunc2(Base* Bae){
  Derived* Der;
  if (Der = dynamic_cast<Derived*>(Bae))
    {Der->func2(); return true;}
  else
    return false;
}

如果您根本不想使用RTTI(包括
dynamic\u cast
),您可以模拟它的行为,就像Qt使用它一样

大纲:

bool CallFunc2(Base* Bae){
  Derived* Der;
  if (Der = dynamic_cast<Derived*>(Bae))
    {Der->func2(); return true;}
  else
    return false;
}

您提到您不知道哪个索引对应于哪个类,但仍然需要调用
func2()
。因此,您不能保证
func2()
将为
派生的
对象调用。调用
Base
对象的
func2()
会得到什么结果?您可能想了解一下。@alexeykuzmin0我想知道类的类型吗?我愿意接受任何其他解决方案:)也许是个愚蠢的问题:当你想以非多态的方式使用多态向量时,使用多态向量有什么意义?你能不能只使用两个向量(一个用于
Base
对象,另一个用于
派生的
obejcts)?@mkmostafa通过基类访问对象的全部意义在于,你想使用它们都保证拥有的接口,而不必知道运行时类型的具体细节。所以你的问题有点颠覆了面向对象编程的整个原则(特别是多态性)。现在当然有办法找出运行时类型,但是如果您向我们解释一下什么是
Base
派生的
func1
func2
实际上在您的代码中,我们可能会提出更好的解决方案。您提到您不知道哪个索引对应于哪个类,但是仍然需要调用
func2()
。因此,您不能保证
func2()
将为
派生的
对象调用。调用
Base
对象的
func2()
会得到什么结果?您可能想了解一下。@alexeykuzmin0我想知道类的类型吗?我愿意接受任何其他解决方案:)也许是个愚蠢的问题:当你想以非多态的方式使用多态向量时,使用多态向量有什么意义?你能不能只使用两个向量(一个用于
Base
对象,另一个用于
派生的
obejcts)?@mkmostafa通过基类访问对象的全部意义在于,你想使用它们都保证拥有的接口,而不必知道运行时类型的具体细节。所以你的问题有点颠覆了面向对象编程的整个原则(特别是多态性)。现在当然有办法找到运行时类型,但是如果您向我们解释一下
Base
派生的
func1
func2
实际上在您的代码中,我们可能会提出更好的解决方案。我使用的是指针向量!有人编辑了我的问题并将其更改为仅对象@西蒙克雷默不,有人不是我。这个问题出了问题,我解决了。然后有人把它回滚到第一个版本。@mkmostafa你说得对。我误解了历史,因为最初的版本被折叠了…@SimonKraemer没问题:)我在使用指针向量!有人编辑了我的问题并将其更改为仅对象@西蒙克雷默不,有人不是我。这个问题出了问题,我解决了。然后有人滚