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未能编译,错误为无法访问类“A”中声明的受保护成员 我应该a将方法a::writeLogEntry设置为公共的,还是b将消息参数传递给a::writeLogEntrymessage的方法b::writeLogEntrymessage设置为公共的,还是c完全其他的方法 谢谢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
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的方法公开可能会产生不必要的后果。