mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 21:40:12 +01:00
Better access control with inheritance should come with better
inheritance support (actually importing inheritance).
C++ Interop Demo:
```c++
// hello_world.h
class HelloWorld {
public:
static auto Pub() -> void;
protected:
static auto Pro() -> void;
private:
static auto Pri() -> void;
};
```
```c++
// hello_world.cpp
#include "hello_world.h"
#include <cstdio>
auto HelloWorld::Pub() -> void { printf("Public!\n"); }
auto HelloWorld::Pro() -> void { printf("Protected!\n"); }
auto HelloWorld::Pri() -> void { printf("Private!\n"); }
```
```carbon
// main.carbon
library "Main";
import Cpp library "hello_world.h";
fn Run() -> i32 {
Cpp.HelloWorld.Pub();
Cpp.HelloWorld.Pro();
Cpp.HelloWorld.Pri();
return 0;
}
```
```shell
$ clang -c hello_world.cpp
$ bazel-bin/toolchain/carbon compile main.carbon
main.carbon:9:3: error: cannot access protected member `Pro` of type `Cpp.HelloWorld`
Cpp.HelloWorld.Pro();
^~~~~~~~~~~~~~~~~~
main.carbon: note: declared here
main.carbon:10:3: error: cannot access private member `Pri` of type `Cpp.HelloWorld`
Cpp.HelloWorld.Pri();
^~~~~~~~~~~~~~~~~~
main.carbon: note: declared here
```
Before this change (no access checks):
```shell
$ bazel-bin/toolchain/carbon compile main.carbon
$ bazel-bin/toolchain/carbon link hello_world.o main.o --output=demo
$ ./demo
Public!
Protected!
Private!
```
Part of #5859.