在Java中,有没有关于何时使用每个访问修饰符,即默认明确的规则(包私有)public,protected并且private,同时使class与interface和处理继承?
在C++中,我想不出一个我希望从基类继承private/protected的情况:
class Base;
class Derived1 : private Base;
class Derived2 : protected Base;
Run Code Online (Sandbox Code Playgroud)
它真的有用吗?
关于继承的访问修饰符的含义我很困惑.是什么涉及继承之间的区别private,protected以及public关键字?
我想在我的派生类中隐藏基本公共属性(数据成员):
class Program
{
static void Main(string[] args)
{
b obj = new b();
obj.item1 = 4;// should show an error but it doent ???
}
}
class a
{
public int item1 {get; set;}
public int item2 { get; set; }
}
class b : a
{
new private int item1;
}
class c : a
{
}
Run Code Online (Sandbox Code Playgroud)
我有成员公开因为我希望成员在c类中继承,但是想要隐藏b类中的成员,我该怎么做?
我没有选择继承我想要在我的基类中的变量??? 多数民众赞成真的很糟糕,我认为ms应该为我们提供一个选项(可能是修改器)来执行此操作
编辑:
我自己找到了答案(我听到很多人告诉我这在c#中是不可能的,但你可以这样做)
我包含代码以防它有用
class Program
{
static void Main(string[] args)
{
b obj = new b();
obj.item1 = …Run Code Online (Sandbox Code Playgroud) 鉴于此基类:
class Employee
{
char* name;
int age;
public:
Employee(char* name);
void print();
};
Run Code Online (Sandbox Code Playgroud)
关于"公众",这有什么区别:
class Manager : public Employee
{
EmployeeList employees;
public:
Manager(char* name, Employee* people);
void print();
};
Run Code Online (Sandbox Code Playgroud)
还有这个:
class Manager : Employee
{
EmployeeList employees;
public:
Manager(char* name, Employee* people);
void print();
};
Run Code Online (Sandbox Code Playgroud) 我正在阅读Scott Meyers的Effective C++(第三版),在第32项的一段中:确保公共继承是第151页的"is-a",他发表了评论(我以粗体显示):
这仅适用于公共继承.只有当Student公开派生于Person时,C++才会表现得如我所描述的那样.私有继承意味着完全不同的东西(见第39项),受保护的继承是我今天的意义所在.
问题是:我该如何解释这个评论?迈耶斯试图传达受保护的遗产很少被认为是有用的,应该避免吗?
(我已经阅读了私有,公共和受保护的继承以及C++ FAQ Lite的私有和受保护的继承部分之间的 区别问题,这两个部分都解释了受保护的继承意味着什么,但是没有让我深入了解何时或为什么它会有用.)
我有一个关于g ++(版本5.1)下的访问声明的问题.
class Base
{
public:
void doStuff() {}
};
class Derived : private Base
{
public:
// Using older access declaration (without using) shoots a warning
// and results in the same compilation error
using Base::doStuff;
};
template<class C, typename Func>
void exec(C *c, Func func)
{
(c->*func)();
}
int main()
{
Derived d;
// Until here, everything compiles fine
d.doStuff();
// For some reason, I can't access the function pointer
exec(&d,&Derived::doStuff);
}
Run Code Online (Sandbox Code Playgroud)
g ++无法使用以下代码编译上述代码:
test.cpp:实例化'void exec(C*,Func)[用C = Derived; …
公共继承很容易.
答:公共B意味着每个A都是B.在大多数编程语言中,如vb.net和objective-c,这是唯一的继承类型.
私人继承也很容易,但毫无意义
答:私人B意味着A由B实现.但是,这是毫无意义的,因为这意味着A应该包含B. 所有权意味着更少的耦合,没有缺点.
然后我们有保护继承.
任何人都可以向我解释这到底是为了什么?有人说这是"作为一种关系".我还不是很清楚.
有没有人有一些样本案例,人们使用受保护的继承以良好的模式(和良心)实际生产用途?
那么有关于这个主题的足够信息.例如,这个线程对我来说非常清楚:私有,公共和受保护的继承之间的区别
除了一点; 为什么有用?
为什么以下代码会遇到错误“ A”,而无法访问“ B”呢?这是我的想法:
每当我们调用函数foo()时,它将执行new B(5),它将首先调用其基本结构A的构造函数。
struct A的构造函数是一个公共方法,因此它的派生struct B应该可以访问它(如果我没有记错的话,应加以保护)。
然后将调用结构B的构造函数以创建具有五个0的向量。
然后删除对象a将调用析构函数B,然后调用析构函数A。
我的逻辑有什么问题吗?您的回答将不胜感激
#include <iostream>
#include <vector>
using namespace std;
struct A
{
A() { cout << "Constructor A called"<< endl;}
virtual ~A() { cout << "Denstructor A called"<< endl;}
};
struct B : private A
{
vector<double> v;
B(int n) : v(n) { cout << "Constructor B called"<< endl;}
~ B() { cout << "Denstructor B called"<< endl;}
};
int main()
{
const A *a = new …Run Code Online (Sandbox Code Playgroud)