C++ 查询C+中的运行时多态性+;
根据我对虚拟函数的理解,编译器处理它的是运行时(vtable机制),那么为什么我会出现编译时错误。您的基类只知道它们自己的成员函数,所以您不能以这种方式使用它。您可以这样做:C++ 查询C+中的运行时多态性+;,c++,visual-studio-2008,C++,Visual Studio 2008,根据我对虚拟函数的理解,编译器处理它的是运行时(vtable机制),那么为什么我会出现编译时错误。您的基类只知道它们自己的成员函数,所以您不能以这种方式使用它。您可以这样做: class base { public: virtual void showbase() { // ---------- } }; class base1 { public: virtual void showbase1() { // ------- } }
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
你问: 我对虚函数的理解是编译器处理 它在运行时运行。为什么会出现编译时错误 因为你写的代码是胡说八道。这里主要介绍多态性的工作原理
为模拟编译器,考虑编译器所看到的:
base1* p1 = new derived();
p1->showbase(); //illegal
p1->showbase1(); //legal
是的,base
是一个多态类。而p
实际上是指向base
的指针。但是由于p
只指向base
,而重要的是不指向base1
(其中showbase1
存在),编译器会这样解释上述代码。显然,我是在解释:
编译器抱怨:
嗯,对不起,伙计,但是base
没有一个名为
showbase1
你问: 我对虚函数的理解是编译器处理 它在运行时运行。为什么会出现编译时错误 因为你写的代码是胡说八道。这里主要介绍多态性的工作原理
p->showbase()代码>和p1->showbase1()代码>p静态类型s类型是base,因此您只能用它调用定义为base的函数,即使在最后,它将是派生的中的函数,因为p的动态类型是派生的
同样的事情也发生在p1上
也许你的意思是p->showbase()代码>和p1->showbase1()代码>
根据我对虚拟函数的理解,编译器处理它的是运行时(vtable机制),那么为什么会出现编译时错误
“处理它”是相当模糊的,vtables不是魔法;在C++中,虚拟调度允许实际函数被称为重写静态声明VIR的函数。