Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.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++类: // base class class A { protected: void writeLogEntry(const std::string& message); }; // derived class class B : public A { }; // c.h class C { myMethod(); } // c.cpp - uses B C::myMethod() { B b; b.writeLogEntry("howdy"); }_C++ - Fatal编程技术网

C++如何通过派生类的实例访问受保护的基类方法 给出以下C++类: // base class class A { protected: void writeLogEntry(const std::string& message); }; // derived class class B : public A { }; // c.h class C { myMethod(); } // c.cpp - uses B C::myMethod() { B b; b.writeLogEntry("howdy"); }

C++如何通过派生类的实例访问受保护的基类方法 给出以下C++类: // base class class A { protected: void writeLogEntry(const std::string& message); }; // derived class class B : public A { }; // c.h class C { myMethod(); } // c.cpp - uses B C::myMethod() { B b; b.writeLogEntry("howdy"); },c++,C++,正如所料,类C未能编译,错误为无法访问类“A”中声明的受保护成员 我应该a将方法a::writeLogEntry设置为公共的,还是b将消息参数传递给a::writeLogEntrymessage的方法b::writeLogEntrymessage设置为公共的,还是c完全其他的方法 谢谢 p你可以和A成为C班的朋友 class A { protected: friend class C; void writeLogEntry(const std::string& messa

正如所料,类C未能编译,错误为无法访问类“A”中声明的受保护成员

我应该a将方法a::writeLogEntry设置为公共的,还是b将消息参数传递给a::writeLogEntrymessage的方法b::writeLogEntrymessage设置为公共的,还是c完全其他的方法

谢谢


p

你可以和A成为C班的朋友

class A {
protected:
    friend class C;
    void writeLogEntry(const std::string& message);
};

AFAIR,应该有用。

你可以和A成为C级的朋友

class A {
protected:
    friend class C;
    void writeLogEntry(const std::string& message);
};

AFAIR,应该有用。

其他人已经回答了,但我建议你阅读更多关于朋友的信息


事实上,阅读整个常见问题解答,而你在它

其他人已经回答了,但我建议你阅读更多关于朋友的信息


事实上,阅读整个常见问题解答,而你在它

我个人会和b一起去。在B中创建一个公共方法来调用a的WriteGentry。但那只是我!:
另外,你也可以像其他人说的那样在A类中使用friend类C。

我个人会选择b类。在B中创建一个公共方法来调用a的WriteGentry。但那只是我!:
另外,您可以像其他人所说的那样在A类中使用friend类C。

我认为如何设计类层次结构真的取决于您自己。如果您使用的是继承,并且您不介意函数可以从类A的实例访问,那么就没有必要委托WriteGentry。也可以在基类中公开它:

class A {
public:
    void writeLogEntry(const std::string& message);
};
如果不想从类A的实例访问WriteGentry,则您有委托:

class B : public A { 
    void writeLogEntry(const std::string& message){ A::writeLogEntry(message); }
};

做一些调查。您可能会对如何构建类有一些想法。有些人希望尽可能避免继承,在这种情况下,让类B拥有类A的实例并委托相关方法。我认为什么时候继承才是合适的,这取决于你特定的野兽的本性。

我认为如何设计你的类层次结构真的取决于你。如果您使用的是继承,并且您不介意函数可以从类A的实例访问,那么就没有必要委托WriteGentry。也可以在基类中公开它:

class A {
public:
    void writeLogEntry(const std::string& message);
};
如果不想从类A的实例访问WriteGentry,则您有委托:

class B : public A { 
    void writeLogEntry(const std::string& message){ A::writeLogEntry(message); }
};

做一些调查。您可能会对如何构建类有一些想法。有些人希望尽可能避免继承,在这种情况下,让类B拥有类A的实例并委托相关方法。I继承是否合适,取决于您的特定野兽的性质。

除了让C类成为a类的朋友之外,如果WriteGentry在a类中是虚拟的,如果它在B类中被公共访问说明符覆盖,那么它可以从C类访问

class A
{
  protected:
  virtual void writeLogEntry() { cout << "A::mymethod" << endl; }
};
class B : public A
{
  public:
       virtual void writeLogEntry() { cout << "B::mymethod" << endl; }
};

class C 
{
 public:
  void writeLogEntry()
  {
     B b;
     b.writeLogEntry();
  }
};

除了使类C成为类a的朋友之外,如果WriteGentry在类a中是虚拟的,并且如果它在类B中被公共访问说明符覆盖,那么它可以从类C访问

class A
{
  protected:
  virtual void writeLogEntry() { cout << "A::mymethod" << endl; }
};
class B : public A
{
  public:
       virtual void writeLogEntry() { cout << "B::mymethod" << endl; }
};

class C 
{
 public:
  void writeLogEntry()
  {
     B b;
     b.writeLogEntry();
  }
};

我更喜欢在基类中声明WriteGentry公共。因为它往往是可访问接口的一部分


如果它是在派生类中声明的,则此方法的用户将紧密绑定到派生类。通常,依赖抽象是一个更好的主意。

我更喜欢在基类中声明WriteGentry public。因为它往往是可访问接口的一部分


如果它是在派生类中声明的,则此方法的用户将紧密绑定到派生类。通常,依赖抽象是一个更好的主意。

如果您不想在B中编写新函数,请将此

class B : public A 
{
public:
     using A::writeLogEntry;
};
你能做到吗

B b;
b.writeLogEntry();

如果不想在B中编写新函数,请将

class B : public A 
{
public:
     using A::writeLogEntry;
};
你能做到吗

B b;
b.writeLogEntry();

啊,是的,我忘了提到我们的内部编码标准禁止使用friend:否定封装,消除抽象障碍,导致紧密耦合和高度相互依赖的类层次结构。这太糟糕了,因为friend有一些合法的用途。啊,是的,我忘了提到我们的内部编码标准禁止使用friend:否定封装,消除抽象障碍,导致紧密耦合和高度相互依赖的类层次结构。这太糟糕了,因为friend有一些合法的用途。谢谢!我的代码是一个非常简单的例子,我想在一个非常大的代码库中进行一些小的更改,尽可能少地干扰现有的代码。委派可能是最好的选择,因为它不会影响其他客户对A的使用,而公开A的方法可能会产生不必要的后果。谢谢!我的代码是一个非常简单的例子,我想在一个非常大的代码库中进行一些小的更改,尽可能少地干扰现有的代码。委派可能是最好的选择,因为它不会影响其他客户使用,where 将A的方法公开可能会产生不必要的后果。