Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/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+中的运行时多态性+;_C++_Visual Studio 2008 - Fatal编程技术网

C++ 查询C+中的运行时多态性+;

C++ 查询C+中的运行时多态性+;,c++,visual-studio-2008,C++,Visual Studio 2008,根据我对虚拟函数的理解,编译器处理它的是运行时(vtable机制),那么为什么我会出现编译时错误。您的基类只知道它们自己的成员函数,所以您不能以这种方式使用它。您可以这样做: class base { public: virtual void showbase() { // ---------- } }; class base1 { public: virtual void showbase1() { // ------- } }

根据我对虚拟函数的理解,编译器处理它的是运行时(vtable机制),那么为什么我会出现编译时错误。

您的基类只知道它们自己的成员函数,所以您不能以这种方式使用它。您可以这样做:

class base
{
public:
    virtual void showbase() {
        // ----------
    }
};

class base1 {
public:
    virtual void showbase1() {
        // -------
    }
};

class derived : public base, public base1
{
    void showbase() {
        // ----  
    }

    void showbase1() {
        // -------
    }
};

int main()
{
    base* p = new derived();
    p->showbase1();

    base1* p1 = new derived();
    p1->showbase();
}
为了回答您关于运行时多态性的问题,正如您所说,它通过vtable处理运行时多态性(后期绑定)。但是对于多重继承,基本上每个基类都有一个vtable。您不能通过指向另一个基类的指针访问一个基类的vtable。

您的基类只知道它们自己的成员函数,因此您不能以这种方式使用它。您可以这样做:

class base
{
public:
    virtual void showbase() {
        // ----------
    }
};

class base1 {
public:
    virtual void showbase1() {
        // -------
    }
};

class derived : public base, public base1
{
    void showbase() {
        // ----  
    }

    void showbase1() {
        // -------
    }
};

int main()
{
    base* p = new derived();
    p->showbase1();

    base1* p1 = new derived();
    p1->showbase();
}

为了回答您关于运行时多态性的问题,正如您所说,它通过vtable处理运行时多态性(后期绑定)。但是对于多重继承,基本上每个基类都有一个vtable。无法通过指向另一个基类的指针访问一个基类的vtable。

指向派生类的基类指针只能访问基类中定义的成员函数。尝试并通过它访问派生类中定义的其他函数是非法的。在您的情况下,
base
类没有定义
showbase1
,因此这是非法的

base* p = new derived();
p->showbase();

base1* p1 = new derived();
p1->showbase1();
但是,您可以这样做:

base* p = new derived();
p->showbase1(); //illegal
同样,您不能使用
base
类指针访问
showbase1

p->showbase(); // legal because showbase is a member function of base

指向派生类的基类指针只能访问基类中定义的成员函数。尝试并通过它访问派生类中定义的其他函数是非法的。在您的情况下,
base
类没有定义
showbase1
,因此这是非法的

base* p = new derived();
p->showbase();

base1* p1 = new derived();
p1->showbase1();
但是,您可以这样做:

base* p = new derived();
p->showbase1(); //illegal
同样,您不能使用
base
类指针访问
showbase1

p->showbase(); // legal because showbase is a member function of base

为模拟编译器,考虑编译器所看到的:

base1* p1 = new derived();
p1->showbase();  //illegal
p1->showbase1(); //legal
是的,
base
是一个多态类。而
p
实际上是指向
base
的指针。但是由于
p
只指向
base
,而重要的是不指向
base1
(其中
showbase1
存在),编译器会这样解释上述代码。显然,我是在解释:

编译器抱怨:

嗯,对不起,伙计,但是
base
没有一个名为
showbase1


你问:

我对虚函数的理解是编译器处理 它在运行时运行。为什么会出现编译时错误

因为你写的代码是胡说八道。这里主要介绍多态性的工作原理

  • 您可以使用虚拟方法定义基类
  • 您可以定义一个派生类来重写这些虚拟方法
  • 编译器创建一个vtable,它将基类中方法的名称映射到派生类中的实现
  • 当您通过指向基类的指针(或ref)调用基类中的方法时,将调用派生类的实现
  • 但你要做的是:

  • 使用虚拟方法定义基类
  • 定义重写这些虚拟方法的派生类
  • 在完全不同的类中调用函数

  • 为模拟编译器,考虑编译器所看到的:

    base1* p1 = new derived();
    p1->showbase();  //illegal
    p1->showbase1(); //legal
    
    是的,
    base
    是一个多态类。而
    p
    实际上是指向
    base
    的指针。但是由于
    p
    只指向
    base
    ,而重要的是不指向
    base1
    (其中
    showbase1
    存在),编译器会这样解释上述代码。显然,我是在解释:

    编译器抱怨:

    嗯,对不起,伙计,但是
    base
    没有一个名为
    showbase1


    你问:

    我对虚函数的理解是编译器处理 它在运行时运行。为什么会出现编译时错误

    因为你写的代码是胡说八道。这里主要介绍多态性的工作原理

  • 您可以使用虚拟方法定义基类
  • 您可以定义一个派生类来重写这些虚拟方法
  • 编译器创建一个vtable,它将基类中方法的名称映射到派生类中的实现
  • 当您通过指向基类的指针(或ref)调用基类中的方法时,将调用派生类的实现
  • 但你要做的是:

  • 使用虚拟方法定义基类
  • 定义重写这些虚拟方法的派生类
  • 在完全不同的类中调用函数
  • p'静态类型s type是base,因此您只能用它调用定义为base的函数,即使最后调用的是派生的函数,因为p的动态类型是派生的

    同样的事情也发生在p1上

    也许你的意思是
    p->showbase()
    p1->showbase1()p静态类型s类型是base,因此您只能用它调用定义为base的函数,即使在最后,它将是派生的中的函数,因为p的动态类型是派生的

    同样的事情也发生在p1上

    也许你的意思是
    p->showbase()
    p1->showbase1()

    根据我对虚拟函数的理解,编译器处理它的是运行时(vtable机制),那么为什么会出现编译时错误

    “处理它”是相当模糊的,vtables不是魔法;在C++中,虚拟调度允许实际函数被称为重写静态声明VIR的函数。