c++;带体的纯虚函数 我最近知道,在C++中,纯虚函数可以有一个体。

c++;带体的纯虚函数 我最近知道,在C++中,纯虚函数可以有一个体。,c++,C++,我知道虚函数体的存在是因为我想从派生类中调用它,但是我可以这样做吗 class Base{ int x; public: virtual void print()=0; }; void Base::print(){ cout << x; } class Derived : public Base{ int y; public: void print(){ Base::print(); co

我知道虚函数体的存在是因为我想从派生类中调用它,但是我可以这样做吗

class Base{
    int x;
  public:
    virtual void print()=0;
};

void Base::print(){
  cout << x;
}

class Derived : public Base{
      int y;
  public:
      void print(){
          Base::print();
          cout << y;
      }
};
类基{
int x;
公众:
虚空打印()=0;
};
void Base::print(){

cout抽象函数当然可以有一个实现,在抽象析构函数的情况下,甚至要求函数仍然被实现(使析构函数虚拟并不意味着只调用派生的析构函数)…抽象函数的实现仍然只是一个普通函数,可以访问其类的成员


在您的示例中,
x
Base
的成员。访问
Base
的私有成员的
Base::print()
有什么令人惊讶的呢?

抽象函数当然可以有一个实现,在抽象析构函数的情况下,甚至要求仍然实现该函数(使析构函数
虚拟
并不意味着只调用派生的析构函数)……抽象函数的实现仍然只是一个普通函数,可以访问其类的成员

在您的示例中,
x
Base
的一个成员。关于
Base::print()
访问
Base
的私有成员,什么是令人惊讶的?

输出将是“12”对于下面的代码,那么是的,将调用带有体的纯虚函数,然后派生的打印。所以,是的,结果是:x值,然后是y值,正如您所猜测的。这是有效的C++,是的,它将知道如何在该上下文中获得“x”。 <>有效C++"Scott Meyers提到了纯虚拟函数具有主体的原因:实现此纯虚拟函数的派生类可以在其代码中调用此实现smwhere。如果两个不同派生类的部分代码相似,则在层次结构中向上移动它是有意义的,即使该函数应该是纯虚拟的。

#include <iostream>

using namespace std;

class Base{
    int x;
  public:
    Base(): x(1) {}
    virtual void print()=0;
};

void Base::print(){
  cout << x;
}

class Derived : public Base{
      int y;
  public:
      Derived(): Base(), y(2) {}
      void print(){
          Base::print();
          cout << y;
      }
};

int main()
{
    Derived d;
    d.print();
    return 0;
}
#包括
使用名称空间std;
阶级基础{
int x;
公众:
Base():x(1){}
虚空打印()=0;
};
void Base::print(){
CUT< P>输出将是“12”,下面的代码,将是,与实体的纯虚拟函数将被调用,然后派生的打印。所以,是的,结果是:x的值,然后是Y的值,正如你猜的。这是有效的C++,是的,它知道如何在这个上下文中获得“x”。
<>有效C++"Scott Meyers提到了纯虚拟函数具有主体的原因:实现此纯虚拟函数的派生类可以在其代码中调用此实现smwhere。如果两个不同派生类的部分代码相似,则在层次结构中向上移动它是有意义的,即使该函数应该是纯虚拟的。

#include <iostream>

using namespace std;

class Base{
    int x;
  public:
    Base(): x(1) {}
    virtual void print()=0;
};

void Base::print(){
  cout << x;
}

class Derived : public Base{
      int y;
  public:
      Derived(): Base(), y(2) {}
      void print(){
          Base::print();
          cout << y;
      }
};

int main()
{
    Derived d;
    d.print();
    return 0;
}
#包括
使用名称空间std;
阶级基础{
int x;
公众:
Base():x(1){}
虚空打印()=0;
};
void Base::print(){

CUTKOL: C++编译器。@ KOL:是的,它们可以有一个甚至可以调用的主体。“Meyers提到了纯虚拟函数具有主体的原因:实现此纯虚拟函数的派生类可以在其代码中调用此实现smwhere。如果两个不同派生类的部分代码相似,则在层次结构中向上移动它是有意义的,即使该函数应该是纯虚拟的。“执行什么操作的结果?另外,
Base::print()
将不会从
Derived
中的函数中获取任何值,因为
Derived
没有返回任何值的函数-您可能需要重新表述该部分。相关:@kol:您的编译器。@kol:是的,它们甚至可以有一个可以调用的主体。:”“有效C++“Meyers提到了纯虚拟函数具有主体的原因:实现此纯虚拟函数的派生类可以在其代码中调用此实现smwhere。如果两个不同派生类的部分代码相似,则在层次结构中向上移动它是有意义的,即使该函数应该是纯虚拟的。“执行什么操作的结果?另外,
Base::print()
将不会从
Derived
中的函数中获取任何值,因为
Derived
没有返回任何值的函数-您可能需要重新表述该部分。相关:@user2713409:这回答了您的问题吗?@user2713409:这回答了您的问题吗?”?