Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.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++_G++ - Fatal编程技术网

C++错误:声明'~析构函数'为“类”成员

C++错误:声明'~析构函数'为“类”成员,c++,g++,C++,G++,我使用g++-Wall-Werror*.cpp编译并得到错误: ConcreteCharArray.h:21:15:错误:将“~CharArray”声明为“ConcreteCharArray”的成员 具体实施: class ConcreteCharArray: public CharArray { private: char * charArray; public: ~CharArray() { delete[] string; } }; 虚拟类: class

我使用g++-Wall-Werror*.cpp编译并得到错误:

ConcreteCharArray.h:21:15:错误:将“~CharArray”声明为“ConcreteCharArray”的成员

具体实施:

class ConcreteCharArray: public CharArray
{
private:
    char * charArray;
public:
   ~CharArray() {
      delete[] string;
   }
};
虚拟类:

class CharArray
{
public:
   virtual ~CharArray() {};
};  
在名为ConcreteCharArray的类中声明名为~CharArray的成员完全是非法的,这是编译器告诉您的。~表示您正在声明析构函数,析构函数的名称必须与类的名称匹配

析构函数是特殊的成员函数。它们的一个特殊属性是,为了重写基类的虚拟析构函数,您不必像通常使用普通成员函数那样在派生类中匹配该析构函数的名称。编译器将自动将析构函数彼此匹配,即使它们的名称不同。这很容易做到,因为每个类只有一个析构函数

所以,如果你想在ConcreteCharArray类中声明一个析构函数,你必须调用该析构函数~ConcreteCharArray。没有其他选择。尽管派生析构函数的名称与基析构函数的名称不同,但派生析构函数将被视为虚拟的,并将覆盖基析构函数。

在名为ConcreteCharArray的类中声明名为~CharArray的成员完全是非法的,这是编译器告诉您的。~表示您正在声明析构函数,析构函数的名称必须与类的名称匹配

析构函数是特殊的成员函数。它们的一个特殊属性是,为了重写基类的虚拟析构函数,您不必像通常使用普通成员函数那样在派生类中匹配该析构函数的名称。编译器将自动将析构函数彼此匹配,即使它们的名称不同。这很容易做到,因为每个类只有一个析构函数


所以,如果你想在ConcreteCharArray类中声明一个析构函数,你必须调用该析构函数~ConcreteCharArray。没有其他选择。即使派生析构函数的名称与基析构函数的名称不同,派生的析构函数将被视为虚析构函数,并将重写基析构函数。

重命名为~ConcreteCharArray该析构函数需要与类同名,因此~CharArray应该是~ConcreteCharArray。重命名为~ConcreteCharArray该析构函数需要与类同名,因此~CharArray应该是~ConcreteCharArray,唯一的问题是析构函数不会被重写。如果实现两个析构函数,则从子析构函数开始调用这两个析构函数。@opatut:它们被重写。对虚拟析构函数的多态调用按照虚拟分派的常规规则分派。这里唯一的一点是派生析构函数总是隐式调用基析构函数和成员析构函数,但情况完全不同。它是内部析构函数行为,它不以任何方式涉及重写。哦,我不值得给出C++继承的建议:但是,实际上,在自然语言中重写意味着原始的东西已经消失了,这绝对不是这里的隐含调用的原始材料,所以你不能真正摆脱一个虚拟的父析构函数。我绝对不会把它称为一个典型的重写例子,尽管从技术上讲,它是。“Aputut:”恰好,一个术语在C++语言命名和一般OOP命名中可能有稍微不同的含义。我明白你在说什么。但是,即使使用普通函数,也可以从该函数的派生版本显式调用多态函数的基本版本。这将重现或与析构函数的行为紧密匹配。不过,在C++术语中,派生函数重写基函数,而其他函数只是重写器的内部行为。一般来说,OOP世界可能会有一个不同的名字,不过…@opatut:顺便说一句,这打开了一个很大程度上是哲学问题的全新领域。例如,如果我编写一个虚拟派生类的函数foo,它只在50%的情况下调用基类的函数foo,比如说,基于随机数生成器,派生foo是否覆盖基类foo唯一的问题是析构函数不会被重写。如果实现两个析构函数,则从子析构函数开始调用这两个析构函数。@opatut:它们被重写。对虚拟析构函数的多态调用按照虚拟分派的常规规则分派。这里唯一的一点是派生析构函数总是隐式调用基析构函数和成员析构函数,但情况完全不同。它是内部析构函数行为,它不以任何方式涉及重写。哦,我不值得给出C++继承的建议:但是,实际上,在NA中重写。
自然语言意味着原始的东西消失了,这绝对不是这里所说的原始东西的隐式调用,所以实际上你不能摆脱一个虚拟的父析构函数。我绝对不会把它称为一个典型的重写例子,尽管从技术上讲,它是。“Aputut:”恰好,一个术语在C++语言命名和一般OOP命名中可能有稍微不同的含义。我明白你在说什么。但是,即使使用普通函数,也可以从该函数的派生版本显式调用多态函数的基本版本。这将重现或与析构函数的行为紧密匹配。不过,在C++术语中,派生函数重写基函数,而其他函数只是重写器的内部行为。一般来说,OOP世界可能会有一个不同的名字,不过…@opatut:顺便说一句,这打开了一个很大程度上是哲学问题的全新领域。例如,如果我编写一个虚拟派生类的函数foo,它只在50%的情况下调用基类的函数foo,比如说,基于随机数生成器,派生foo是否覆盖基类foo