Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/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++ 使用基类虚方法_C++ - Fatal编程技术网

C++ 使用基类虚方法

C++ 使用基类虚方法,c++,C++,从这个代码开始: class Base{ public: virtual void foo(){....} }; class Derived{ public: void foo(){....} }; 如果d是一个派生的对象,我能以某种方式调用基类中为此对象定义的foo方法吗 Edit:我的意思是从外部,例如d.foo()绑定到Base::foo()在调用中显式指定它 #include <iostream> class Base{ public: virtu

从这个代码开始:

class Base{
public:
    virtual void foo(){....}
};
class Derived{
public:
    void foo(){....}
};
如果
d
是一个
派生的
对象,我能以某种方式调用基类中为此对象定义的foo方法吗


Edit:我的意思是从外部,例如
d.foo()
绑定到Base::foo()

在调用中显式指定它

#include <iostream>

class Base{
public:
    virtual void foo(){
      std::cout << "Base" << std::endl;
    }
};
class Derived : public Base{
public:
    void foo(){
      std::cout << "Derived" << std::endl;

    }
};

int main()
{
  Derived d;
  d.Base::foo();
  return 0;
}
#包括
阶级基础{
公众:
虚拟void foo(){

std::cout在调用中显式指定它

#include <iostream>

class Base{
public:
    virtual void foo(){
      std::cout << "Base" << std::endl;
    }
};
class Derived : public Base{
public:
    void foo(){
      std::cout << "Derived" << std::endl;

    }
};

int main()
{
  Derived d;
  d.Base::foo();
  return 0;
}
#包括
阶级基础{
公众:
虚拟void foo(){

std::cout要从外部代码调用它,仍然可以在调用中显式限定名称:

#include <iostream>
#include <vector>

struct base { 
    virtual void do_something() { std::cout << "Base::do_something();\n"; }
};

struct derived : public base { 
    virtual void do_something() { std::cout << "derived::do_something();\n"; }
};

int main() {

    derived d;

    d.base::do_something();
    return 0;
}
#包括
#包括
结构基{

virtual void do_something(){std::cout要从外部代码调用它,仍然可以在调用中显式限定名称:

#include <iostream>
#include <vector>

struct base { 
    virtual void do_something() { std::cout << "Base::do_something();\n"; }
};

struct derived : public base { 
    virtual void do_something() { std::cout << "derived::do_something();\n"; }
};

int main() {

    derived d;

    d.base::do_something();
    return 0;
}
#包括
#包括
结构基{
virtual void do_something(){std::cout只需限定调用(假设
派生的
实际上继承自
,而在您的代码中它没有继承):

现在,虽然这是可行的,但也很有问题。如果该方法是虚拟的,那么它就意味着被重写,用户不应该调用特定的重写,而应该调用最终的重写器,否则他们就有可能一路破坏类不变量

考虑到
Derived::foo
的实现做了一些额外的工作来保持一些不变量,如果用户调用
Base::foo
,那么这些额外的工作将不会完成,并且不变量被破坏,使对象处于无效状态。

只需限定调用即可(假设
派生的
实际上继承自
,而在您的代码中它并没有继承该基):

现在,虽然这是可行的,但也很有问题。如果该方法是虚拟的,那么它就意味着被重写,用户不应该调用特定的重写,而应该调用最终的重写器,否则他们就有可能一路破坏类不变量


考虑到
Derived::foo
的实现做了一些额外的工作来保持一些不变量,如果用户调用
Base::foo
,这些额外的工作将不会完成,并且不变量被破坏,使对象处于无效状态。

是的,我忘了指定。从外部看。@Aslan986:您真的需要这样做吗?是吗你真的真的需要这么做吗?在很多情况下,强制调用来执行一个特定的重写是一个很坏的想法……你可能会导致不想要的结果,坏的不变量……DavoDrdRig Guez Drimeas:我相信你是对的。这对我来说也是个坏主意。我只是在学习C++,我想了解我能做什么和我不能做什么。orgot来指定。从外部。@Aslan986:你真的需要这样做吗?你真的,真的需要这样做吗?在很多情况下,强制调用执行特定的重写是一个非常糟糕的主意…你可能会导致不想要的结果,破坏不变量…@DavidRodríguez dribeas:我相信你是对的。这对我来说也是一个坏主意。我是j学习C++,我想知道我能做什么,我不能做什么。这回答了这个问题,是正确的,但我仍然觉得如果你必须这样做,有些事情是非常错误的。“约翰迪布林我只是通过了其他答案,必须同意。有一些错误,但我已经在与遗留代码的情况下,需要SOM。诸如此类,所以我省略了建议。以这种方式调用函数的能力不应该成为任何设计的一部分。这确实回答了问题,而且是正确的,但我仍然觉得如果你必须这样做,有些事情是非常错误的。@johndilling我只是浏览了其他答案,并且不得不同意。有些事情是错误的,但是我曾经遇到过需要类似的遗留代码的情况,因此我省略了建议。以这种方式调用函数的能力不应该是任何设计的一部分。+1根据问题的参数,这仍然是正确的,但更好,因为它解决了可能出现的混乱。+1这仍然是正确的这是对问题参数的一种解释,但更好,因为它解决了可能出现混乱的问题。